0

タイトルが示すように、一部のコンテンツを動的に非表示または表示したいと考えています。ラジオボタンのように機能する2つのボタンがあります。各ボタンは特定のコンテンツを表示する必要がありますが、2 つのコンテンツが同時に表示されないようにする必要があります (これは一種のフォームであり、2 つのサブクラスに取り組んでいます)。

SO で興味深いものを 2 つ見たので、それらを混ぜてみたいと思いました。まず、ToggleButton での ContentControl の使用 (http://stackoverflow.com/questions/7698560/how-to-bind-click-of-a-button-to-change-the-content-of-a-panel- grid-using-xaml)。次に、ToggleButtons を RadioButtons として使用します (http://stackoverflow.com/questions/2362641/how-to-get-a-group-of-toggle-buttons-to-act-like-radio-buttons-in-wpf 2 つ目の回答と 31)

だから私はそのようなものから始めることにしました:

<ContentControl>
    <ContentControl.Template>
        <ControlTemplate>
            <WrapPanel HorizontalAlignment="Center">
                <TextBlock Text="{x:Static Internationalization:Resources.MAINOPTIONSWINDOW_STATUSLINKSUPERVISOR}"/>
                <RadioButton Style="{StaticResource {x:Type ToggleButton}}" Content="Alarm" GroupName="Trigger"/>
                <RadioButton Style="{StaticResource {x:Type ToggleButton}}" Content="Event" GroupName="Trigger"/>

            </WrapPanel>
        </ControlTemplate>
    </ContentControl.Template>
</ContentControl>

しかし、Visual Studio は下線を引いています

{StaticResource {x:Type ToggleButton}}

視覚的には、ボタンはトグル ボタンではなく、ラジオ ボタンのように見えます。ビジュアルは次のように述べています。

リソース「{StaticResource {x:Type ToggleButton}}」を解決できません (フランス語からの翻訳;))

とにかく、このコードは ContentControl の外で正常に動作します。

4

3 に答える 3

1

ええ、まず、eventHandlers を修正します。それらをテンプレートに添付しないでください。トリッキーなことが起こる可能性があります。

次に、ContentControl.Resources を変更して、これをそこに置くことができます。

<Style BasedOn="{StaticResource {x:Type ToggleButton}}"
          TargetType="RadioButton"/>

独自のスタイル定義を削除します。そのレベルを 1 つ上げることもできます (ContentControl の親)。もう 1 つ、コード ビハインドでこれを行っていますが、WPF の真の力は、少なくともこのようなロジックにはコード ビハインドが必要ないという事実から得られます。

あなたが与えたリンクも、トリガーを使用しています。これは今のところ大したことではありませんが、正しい方法ではないことを知っておく必要があります。コンテンツを切り替えたい場合は、ContentControl Content、DataTemplates、DataTemplateSelector を確認してください。アイデアは、物事を隠すのではなく、メモリに VIEW を 1 つだけ持つことです。

あなたが他の方法をしているなら、それは追いつくことができます。最終的には、起動とメモリ使用に時間がかかります。

于 2012-08-29T17:55:06.820 に答える
0

コントロールテンプレートでは、通常、イベントハンドラーを追加しません。

OnApplyTemplateをオーバーライドし、そこにハンドラーを追加します。

于 2012-08-29T16:59:10.510 に答える
0

やっと別の方法を見つけた

<RadioButton Content="Alarm" GroupName="TriggerStateInfo" Style="{StaticResource {x:Type ToggleButton}}"
      Command="{x:Static StateInfoTemplateToAlarmCommand}"/>
<RadioButton Content="Event" GroupName="TriggerStateInfo" Style="{StaticResource {x:Type ToggleButton}}"
              Command="{x:Static StateInfoTemplateToEventCommand}"/>
<ContentControl Content="{Binding Path=Trigger, ElementName=Window}">
    <ContentControl.Resources>
        <DataTemplate DataType="{x:Type States:AlarmTrigger}">
            <ComboBox ItemsSource="{Binding Path=AlarmTriggersCollection}" />
        </DataTemplate>
        <DataTemplate DataType="{x:Type States:EventTrigger}">
            <ComboBox ItemsSource="{Binding Path=EventTriggersCollection}" />
        </DataTemplate>
    </ContentControl.Resources>
</ContentControl>

トリガーのタイプを変更するコードビハインド

于 2012-08-30T15:42:51.827 に答える