1

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

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

问候

托尼

对原始问题的补充

我的实现如下

<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”属性的有效值。我不知道为什么会这样。我相信我的绑定没问题,因为它可以拾取字符串......

4

2 回答 2

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}" />

您还可以允许用户Content为您的UserControlor指定 a Window,并使用ContentPresenter绑定到Content. 像这样的东西:

<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>
于 2012-11-12T15:56:56.780 回答
1

我认为单个窗口是可能的。通过公开一个基于某些条件设置可见性的属性。即文本框可见性设置为visibility.visible 和combobox,slider visibilty 设置为visibility.collpased.similarly,如果你想让combobox 可见,你可以让combobox 可见而其他collapsed.similarly 对于滑块。

例子:

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

我希望这回答了你的问题

于 2012-11-12T13:43:57.553 回答