1

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」がセッターの「System.Windows.Controls.ContentControl.ContentTemplate」プロパティの有効な値ではないというエラーが発生します。なぜこれが起こっているのか分かりません。文字列を拾うので、私のバインディングはOKだと思います。

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

また、ユーザーがorにContentを指定できるようにし、 へのバインドを使用して単純に表示することもできます。このようなもの:UserControlWindowContentPresenterContent

<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 に設定され、コンボボックス、スライダーの可視性は visibility.collpased.similarly に設定されます。

例:

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

これがあなたの質問に答えることを願っています

于 2012-11-12T13:43:57.553 に答える