WPF创建多用途控件

时间:2012-11-12 11:00:41

标签: wpf xaml

我正在尝试创建一个WPF窗口,它只显示一个控件和2个按钮。 控件可以是TextBox,ComboBox或Slider,具体取决于为启动此窗口而选择的对象类型。

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

此致

原始问题的补充

我的实施如下

<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 ....

2 个答案:

答案 0 :(得分:3)

我会根据需要的控件类型<ContentControl><ContentTemplate>执行此操作。

您没有指定控件类型如何传递给窗口,因此您的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}" />

您还可以允许用户为ContentUserControl指定Window,并使用绑定到ContentPresenter的{​​{1}}进行显示。像这样:

Content

然后你可以像这样使用它:

<UserControl.Template>
    <StackPanel>
        <ContentPresenter Content="{TemplateBinding Content}" />
        <Button ... />
        <Button ... />
    </StackPanel>
</UserControl.Template>

答案 1 :(得分:1)

我认为单窗口是可能的。通过暴露一个根据某些条件设置visibilty的属性。 即文本框可见性设置为visibility.visible和combobox,滑块visibilty设置为visibility.collpased.similarly,如果你想让组合框可见,你可以使其可见,其他则折叠。类似于滑块。

示例:

  public Visibility TextboxVisibility
    {
        set
        {
            Visibility visible = value;
            Textboxname.Visibility = visible ;
        }
    }

我希望这能回答你的问题