WPF创建多用途控件
我正在尝试创建一个WPF窗口,它有一个控件和两个按钮。 控件可以是文本框、组合框或滑块,具体取决于启动此窗口所选对象的类型 是否可以这样做,或者我必须创建一个包含3个CONRTOL的窗口,并在运行时操纵它们的位置 问候 托尼 对原始问题的补充 我的实现如下WPF创建多用途控件,wpf,xaml,Wpf,Xaml,我正在尝试创建一个WPF窗口,它有一个控件和两个按钮。 控件可以是文本框、组合框或滑块,具体取决于启动此窗口所选对象的类型 是否可以这样做,或者我必须创建一个包含3个CONRTOL的窗口,并在运行时操纵它们的位置 问候 托尼 对原始问题的补充 我的实现如下 <Window.Resources> <Style TargetType="TextBox" x:Key="TextBoxTemplate"> <Setter Value=
<Window.Resources>
<Style TargetType="TextBox" x:Key="TextBoxTemplate">
<Setter Value="{Binding ElementName=MyWindow, Path=m_csValue}" />
</Style>
<Style TargetType="{x:Type ComboBox}" x:Key="ComboBoxTemplate">
<Setter Value="{Binding ElementName=MyWindow, Path=ItemsForSelection}" />
</Style>
<Style TargetType="{x:Type Slider}" x:Key="SliderTemplate">
<Setter Value="{Binding ElementName=MyWindow, Path=SliderDetail}" />
</Style>
<Style TargetType="{x:Type ContentControl}" x:Key="DisplayValues">
<!-- Default Template -->
<Setter Property="ContentTemplate" Value="{StaticResource TextBoxTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=MyWindow, Path=eType}" Value="{x:Static local:eTagDisplay.Text}">
<Setter Property="ContentTemplate">
<Setter.Value>
<ControlTemplate Template="{StaticResource TextBoxTemplate}" />
</Setter.Value>
</Setter>
</DataTrigger>
<!-- DataTrigger Binding="{Binding ElementName=MyWindow, Path=eType}" Value="{x:Static local:eTagDisplay.Combo}">
<Setter Property="ContentTemplate">
<Setter.Value>
<ControlTemplate Template="{StaticResource ComboBoxTemplate}" />
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=MyWindow, Path=eType}" Value="{x:Static local:eTagDisplay.Slider}">
<Setter Property="ContentTemplate">
<Setter.Value>
<ControlTemplate Template="{StaticResource SliderTemplate}" />
</Setter.Value>
</Setter>
</DataTrigger -->
</Style.Triggers>
</Style>
</Window.Resources>
<Grid Width="267">
<StackPanel Name="TagEditor1">
<!-- Text="{Binding ElementName=MyWindow, Path=m_csValue}" / -->
<ContentControl Style="{StaticResource DisplayValues}" />
</StackPanel>
<Button Content="OK" Height="23" HorizontalAlignment="Left" Margin="12,154,0,0" Name="btnOK" VerticalAlignment="Top" Width="75" Click="OnClkOK" />
<Button Content="Cancel" Height="23" HorizontalAlignment="Left" Margin="180,154,0,0" Name="btnCancel" VerticalAlignment="Top" Width="75" Click="OnClkCancel" IsCancel="True" />
</Grid>
我收到一个错误“System.Windows.Style”不是setter上“System.Windows.Controls.ContentControl.ContentTemplate”属性的有效值。我不知道为什么会这样。
我相信我的绑定是可以的,因为它拾取字符串OK….我认为使用单个窗口是可能的。通过公开基于某些条件设置可见性的属性。 i、 e文本框可见性设置为visibility.visible和combobox,滑块visibility设置为visibility.collpased。类似地,如果要使combobox可见,请使其可见,并折叠其他控件。对于滑块,类似地 例如:
public Visibility TextboxVisibility
{
set
{
Visibility visible = value;
Textboxname.Visibility = visible ;
}
}
我希望这能回答您的问题我认为单窗口是可能的。通过公开基于某些条件设置可见性的属性。 i、 e文本框可见性设置为visibility.visible和combobox,滑块visibility设置为visibility.collpased。类似地,如果要使combobox可见,请使其可见,并折叠其他控件。对于滑块,类似地 例如:
public Visibility TextboxVisibility
{
set
{
Visibility visible = value;
Textboxname.Visibility = visible ;
}
}
我希望这能回答您的问题我会使用一个
,它根据需要的控制类型具有不同的
您没有指定如何将控件类型传递到窗口,因此您的DataTrigger
绑定可能与我的绑定有点不同,但这应该给您一个正确的想法:
<DataTemplate TargetType="{x:Type ContentControl}" x:Key="TextBoxTemplate">
<TextBox ... />
</DataTemplate>
<DataTemplate TargetType="{x:Type ContentControl}" x:Key="ComboBoxTemplate">
<ComboBox ... />
</DataTemplate>
<DataTemplate TargetType="{x:Type ContentControl}" x:Key="SliderTemplate">
<Slider ... />
</DataTemplate>
<Style x:Key="MyStyle" TargetType="{x:Type ContentControl}">
<!-- Default Template -->
<Setter Property="ContentTemplate"
Value="{StaticResource TextBoxTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding SomeBoundValue}" Value="ComboBox">
<Setter Property="ContentTemplate"
Value="{StaticResource ComboBoxTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding SomeBoundValue}" Value="Slider">
<Setter Property="ContentTemplate"
Value="{StaticResource SliderTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
...
<ContentControl Style="{StaticResource MyStyle}" />
然后你可以这样使用它:
<UserControl.Template>
<StackPanel>
<ContentPresenter Content="{TemplateBinding Content}" />
<Button ... />
<Button ... />
</StackPanel>
</UserControl.Template>
<local:MyUserControl>
<TextBox ... />
</local:MyUserControl>
<local:MyUserControl>
<ComboBox ... />
</local:MyUserControl>
<local:MyUserControl>
<Slider ... />
</local:MyUserControl>
我会使用一个
来实现这一点,该
具有不同的
,具体取决于所需的控件类型
您没有指定如何将控件类型传递到窗口,因此您的DataTrigger
绑定可能与我的绑定有点不同,但这应该给您一个正确的想法:
<DataTemplate TargetType="{x:Type ContentControl}" x:Key="TextBoxTemplate">
<TextBox ... />
</DataTemplate>
<DataTemplate TargetType="{x:Type ContentControl}" x:Key="ComboBoxTemplate">
<ComboBox ... />
</DataTemplate>
<DataTemplate TargetType="{x:Type ContentControl}" x:Key="SliderTemplate">
<Slider ... />
</DataTemplate>
<Style x:Key="MyStyle" TargetType="{x:Type ContentControl}">
<!-- Default Template -->
<Setter Property="ContentTemplate"
Value="{StaticResource TextBoxTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding SomeBoundValue}" Value="ComboBox">
<Setter Property="ContentTemplate"
Value="{StaticResource ComboBoxTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding SomeBoundValue}" Value="Slider">
<Setter Property="ContentTemplate"
Value="{StaticResource SliderTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
...
<ContentControl Style="{StaticResource MyStyle}" />
然后你可以这样使用它:
<UserControl.Template>
<StackPanel>
<ContentPresenter Content="{TemplateBinding Content}" />
<Button ... />
<Button ... />
</StackPanel>
</UserControl.Template>
<local:MyUserControl>
<TextBox ... />
</local:MyUserControl>
<local:MyUserControl>
<ComboBox ... />
</local:MyUserControl>
<local:MyUserControl>
<Slider ... />
</local:MyUserControl>
谢谢您的回复,这正是我想要的款式。由于这种类型的东西对我来说是新的,我对如何将XAML集成到我的主要XAML主体中有点困惑。我已将样式信息添加到window.resources中,但如何在块中使用它。关于使用哪种样式的决定将取决于创建时传递给窗口的整数,例如,如果(style==button){controltype=button;}?谢谢again@maycockt该样式适用于内容控件
,因此您可以在希望控件出现的任何位置使用
。您还必须修改DataTriggers
,使其基于决定样式的integer属性,例如
(确保controltype
是类的公共属性)@maycockt很好,我们都是新的:)最后一条注释是这样读的-请原谅这里的匙送。。。。如果我只想在我的窗口中有3个控件,我会这样呈现它?上面列出的我的控件类型是一个枚举,例如eType,因此如果TextBox被声明为eType,那么DataTrigger将类似于“”。TextBox如果在c#?@maycockt Close中编码,您将希望在以前的注释中使用
,而不是
。ContentControl
应该应用样式
,而样式
应该在.Resources
的某个地方找到,比如
。另外,我认为您需要在DataTrigger.value中使用实际的枚举值,例如value=“{x:Static local:eType.TextBox}”
。否则,它可能会返回false,因为它将尝试将类型为eType
的对象与字符串值为TextBox
的对象进行比较。另外,要使触发器工作,StackPanel1
需要一个名为eType
的属性。谢谢您的回复,这就是我一直在寻找的样式。由于这种类型的东西对我来说是新的,我对如何将XAML集成到我的主要XAML主体中有点困惑。我已将样式信息添加到window.resources中,但如何在块中使用它。关于使用哪种样式的决定将取决于创建时传递给窗口的整数,例如,如果(style==button){controltype=button;}?谢谢again@maycockt该样式适用于内容控件
,因此您可以在希望控件出现的任何位置使用
。您还必须修改DataTriggers
,使其基于决定样式的integer属性,例如
(确保controltype
是类的公共属性)@maycockt很好,我们都是新的:)最后一条注释是这样读的-请原谅这里的匙送。。。。如果我只想在我的窗口中有3个控件,我会这样呈现它?上面列出的我的控件类型是一个枚举,例如eType,因此如果TextBox被声明为eType,那么DataTrigger将类似于“”。TextBox如果在c#?@maycockt Close中编码,您将希望在以前的注释中使用
,而不是
。ContentControl
应该应用样式
,而样式
应该在参考资料中找到<