WPF创建多用途控件

WPF创建多用途控件,wpf,xaml,Wpf,Xaml,我正在尝试创建一个WPF窗口,它有一个控件和两个按钮。 控件可以是文本框、组合框或滑块,具体取决于启动此窗口所选对象的类型 是否可以这样做,或者我必须创建一个包含3个CONRTOL的窗口,并在运行时操纵它们的位置 问候 托尼 对原始问题的补充 我的实现如下 <Window.Resources> <Style TargetType="TextBox" x:Key="TextBoxTemplate"> <Setter Value=

我正在尝试创建一个WPF窗口,它有一个控件和两个按钮。 控件可以是文本框、组合框或滑块,具体取决于启动此窗口所选对象的类型

是否可以这样做,或者我必须创建一个包含3个CONRTOL的窗口,并在运行时操纵它们的位置

问候

托尼

对原始问题的补充

我的实现如下

<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
应该应用
样式
,而
样式
应该在
参考资料中找到<