0

XAML で定義された ContextMenu があり、コードでそれを変更します。

ContextMenu EditContextMenu;
EditContextMenu  = (ContextMenu)this.FindResource("EditContextMenu");
//Modify it here...

ContextMenu次に、データ バインディングを使用して、XAML テーマ ファイル内のすべての TextBoxes、DatePickers などに設定する必要があります。メインウィンドウにプロパティを追加しようとしました:

    public ContextMenu sosEditContextMenu
    {
        get
        {
            return EditContextMenu;
        }
    }

...そして次のようにバインドします(以下は、プロパティが定義されているメインウィンドウの ' FTWin' のテーマファイルからのものです):NamesosEditContextMenu

<Style TargetType="{x:Type TextBox}">
    <Setter Property="ContextMenu" Value="{Binding Source=FTWin, Path=sosEditContextMenu}"/>
</Style>

...しかし、うまくいきません。さまざまなことを試しましたが、リソースが見つからないという例外が発生したか、何も起こりませんでした。

私がやろうとしていることは可能ですか? はいの場合、何が間違っていますか? オブジェクトの DataContext を設定することが役立つかどうかはわかりませんが、コードですべての TextBoxes に設定するのはあまり良くありませんか?

4

1 に答える 1

2

xaml で定義したメニューを、テキスト ボックスから表示できるリソース ディクショナリに配置し、バインディングを使用する代わりに、StaticResource を使用してスタイルにリンクします。

<Window x:Class="ContextMenu.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>

        <!-- The XAML defined context menu, note the x:Key -->
        <ContextMenu x:Key="EditContextMenu">
            <ContextMenu.Items>
                <MenuItem Header="test"/>
            </ContextMenu.Items>
        </ContextMenu>

        <!-- This sets the context menu on all text boxes for this window .-->
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="ContextMenu" Value="{StaticResource EditContextMenu}"/>
        </Style>        
    </Window.Resources>

    <Grid>

        <!-- no context menu needs to be defined here, it's in the sytle.-->
        <TextBox />
    </Grid>
</Window>

リソースを探すことで、コードビハインドで変更できます

public MainWindow()
{
    InitializeComponent();

    System.Windows.Controls.ContextMenu editContextMenu = (System.Windows.Controls.ContextMenu)FindResource("EditContextMenu");
    editContextMenu.Items.Add(new MenuItem() { Header = "new item" });
}
于 2012-11-06T15:10:26.383 に答える