在WPF中创建UserControl时,我发现给它一些任意的Height和Width值很方便,这样我就可以在Visual Studio设计器中查看我的更改.但是,当我运行控件时,我希望高度和宽度未定义,以便控件将展开以填充我放入的任何容器.如何在不必删除高度和宽度值之前实现相同的功能建立我的控制?(或者不在父容器中使用DockPanel.)
以下代码演示了此问题:
<Window x:Class="ExampleApplication3.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:ExampleApplication3"
Title="Example" Height="600" Width="600">
<Grid Background="LightGray">
<loc:UserControl1 />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
以下定义UserControl1在设计时合理显示,但在运行时显示为固定大小:
<UserControl x:Class="ExampleApplication3.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<Grid Background="LightCyan" />
</UserControl>
Run Code Online (Sandbox Code Playgroud)
以下定义UserControl1在设计时显示为点,但Window1在运行时展开以填充父级:
<UserControl x:Class="ExampleApplication3.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid Background="LightCyan" />
</UserControl>
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个Grid包含两行的用户控件.标题的第一行和第二行的内容将在用户控件之外定义,例如Button在我们的示例中.
不知何故,我没有让它工作.
UserControl1 xaml:
<Grid Background="LightBlue">
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Text="Title" FontSize="30" Margin="10,0,0,0"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
MainWindow xaml:
<Grid>
<local:UserControl1>
<Button>Click me</Button>
</local:UserControl1>
</Grid>
Run Code Online (Sandbox Code Playgroud)
下面的图片应该解释我的问题:

由于asp.net中没有用户控件的标题部分,因此用户控件无法知道样式表文件.因此,visual studio无法识别用户控件中的css类并产生警告.如何让用户控件知道它将与css类相关,所以如果它警告我一个不存在的css类,这意味着该类真的不存在?
编辑:或者我应该采用不同的设计,比如将css类暴露为GridView的"HeaderStyle-CssClass"等属性?
从基于的自定义控件TextBox,我Items以这种方式创建了一个名为的属性:
public class NewTextBox : TextBox
{
public ItemCollection Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在XAML中使用自定义控件时,我无法绑定属性,因为它引发异常"A'Binding'只能在DependencyObject的DependencyProperty上设置."
我该如何解决这个例外?
如果我创建一个UserControl并向其添加一些对象,我如何获取它将呈现的HTML?
恩.
UserControl myControl = new UserControl();
myControl.Controls.Add(new TextBox());
// ...something happens
return strHTMLofControl;
Run Code Online (Sandbox Code Playgroud)
我想将新构建的UserControl转换为HTML字符串.
我有一个UserControl,我需要通知父页面点击了一个按钮UserControl.如何UserControl在主页面上引发事件并将其捕获?我尝试过使用static,很多人建议我去参加活动!
我一直在阅读有关用户和自定义控件之间差异的一些解释,例如:http: //www.wpftutorial.net/CustomVsUserControl.html
例如,我想创建一个带有2个组合框的数据网格的简单组合,这些组合框负责更改数据网格项目的值.我想为此创建一个特定的控件,因为我将使用它很多次.我想实现后面的逻辑然后在xaml调用中我只需要指定itemsSource.
对于此示例,我应该创建用户控件还是自定义控件?由于我将拥有属性和逻辑,我应该有一个用于此控件的viewmodel吗?
编辑:你知道一些文章在这两个选项之间有明确的概念分离吗?
我正在尝试访问内容控件的控件模板内的用户控件.特别:
<ContentControl x:Name="MyList" >
<ContentControl.Template>
<ControlTemplate x:Name="MyControlTemplate">
<Border RenderTransformOrigin="0,0" x:Name="border">
<UserControls:MyControl x:Name="MyControlName" Width="100" ViewModel="{Binding}" />
Run Code Online (Sandbox Code Playgroud)
我可以访问this.MyList,但它说明了找不到.MyControlName.在这种情况下如何从代码隐藏中访问MyControlName对象?
谢谢!
我最近做了一个UserControl,花了很长时间,因为我不得不使用自定义依赖属性等等...
无论如何,它只是一堆3个控件:TextBox,Popup with Hierarchical Tree.
现在我意识到我可能只能写一个ControlTemplate.那么使用UserControl有什么好处?
[编辑]:我想出了如何自己做这件事.我发布了我的解决方案,希望能在几天谷歌上搜索其他人.如果您是WPF大师,请查看我的解决方案,让我知道是否有更好/更优雅/更有效的方法来做到这一点.特别是,我有兴趣知道我不知道的...这个解决方案怎么会让我不知所措?问题实际上归结为暴露内部控制属性.
问题:我正在创建一些代码,以便在WPF中为XML文件自动生成数据绑定GUI.我有一个xsd文件,可以帮助我确定节点类型等.简单的键/值元素很容易.
当我解析这个元素时:
<Key>value</Key>
Run Code Online (Sandbox Code Playgroud)
我可以创建一个新的'KeyValueControl'并设置DataContext为这个元素.KeyValue被定义为UserControl,并且只有一些简单的绑定.它适用于任何简单的XElement.
此控件中的XAML如下所示:
<Label Content={Binding Path=Name} />
<TextBox Text={Binding Path=Value} />
Run Code Online (Sandbox Code Playgroud)
结果是一行包含带有元素名称的标签和一个带有我可以编辑的值的文本框.
现在,有时我需要显示查找值而不是实际值.我想创建一个类似于上面KeyValueControl的'KeyValueComboBox',但是能够指定(基于文件中的信息)ItemsSource,Display和Value路径.'Name'和'Value'绑定与KeyValueControl相同.
我不知道标准用户控件是否可以处理这个问题,或者我是否需要从Selector继承.
控件中的XAML看起来像这样:
<Label Content={Binding Path=Name} />
<ComboBox SelectedValue={Binding Path=Value}
ItemsSource={Binding [BOUND TO THE ItemsSource PROPERTY OF THIS CUSTOM CONTROL]
DisplayMemberPath={Binding [BOUND TO THE DisplayMemberPath OF THIS CUSTOM CONTROL]
SelectedValuePath={Binding [BOUND TO THE SelectedValuePath OF THIS CUSTOM CONTROL]/>
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我会做这样的事情(假设这个节点是'Thing'并且需要显示Things列表,以便用户可以选择ID:
var myBoundComboBox = new KeyValueComboBox();
myBoundComboBox.ItemsSource = getThingsList();
myBoundComboBox.DisplayMemberPath = "ThingName";
myBoundComboBox.ValueMemberPath = "ThingID"
myBoundComboBox.DataContext = thisXElement;
...
myStackPanel.Children.Add(myBoundComboBox)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
1)我应该从Control或Selector继承我的KeyValueComboBox吗?
2)如果我应该从Control继承,我如何公开内部组合框的ItemsSource,DisplayMemberPath和ValueMemberPath以进行绑定?
3)如果我需要继承Selector,有人可以提供一个小例子来说明我如何开始使用它吗?再说一次,我是WPF的新手,所以如果这是我需要走的路,一个好的,简单的例子真的会有所帮助.
user-controls ×10
wpf ×7
c# ×3
binding ×2
.net ×1
asp.net ×1
autosize ×1
code-behind ×1
combobox ×1
css ×1
events ×1
html ×1
mvvm ×1
raiseevent ×1
silverlight ×1
syntax ×1
viewmodel ×1
wpf-controls ×1