2

私のアプリには、たくさんのコンテキスト メニューがあります。それらのほとんどには、切り取り、コピー、貼り付けコマンドのメニュー項目など、多くの標準エントリが含まれています。各メニューにはアイコンが付いています。

アプリケーション全体で利用可能な MenuItem の各タイプのスタイルを定義するにはどうすればよいですか? 次の xaml は主に私が探しているものですが、画像の宣言は無効です (スタイルのインスタンスが同時に複数の位置で使用されている場合、画像は表示されません)。

<Style x:Key="CutMenuItem_Style" TargetType="{x:Type MenuItem}" >
     <Setter Property="Command" Value="Cut"/>
     <Setter Property="Header" Value="Cut"/>
     <Setter Property="Icon" >
          <Setter.Value>
              <Image Source="/image/cut_16_16.png" Stretch="None" />
            </Setter.Value>
     </Setter>                                            
</Style>

これどうやってやるの?メニューの種類ごとに ControlTemplate を宣言していますか?

注: 上記の xaml が期待どおりに機能しない理由を理解しました。上記のコードで意図したのと同じことを行うための代替の信頼できる方法に興味があります。

4

2 に答える 2

2

これが機能するかどうかはわかりませんが(テストはしていません)、次のようなことができる可能性に興味があります。

class MyMenuItem
{
    public ICommand Command { get; set; }
    public string Header { get; set; }
    public ImageSource ImageSource { get; set; }
}

var cutMenuItem = new MyMenuItem()
{
    Command = ...,
    Header = "Cut",
    ImageSource = ...
};

次に、DataTemplatesを使用します。

<DataTemplate DataType="{x:Type local:MyMenuItem}">
    <MenuItem Command="{Binding Command}" Header="{Binding Header}" 
              Icon="{Binding ImageSource}" />
    </MenuItem>
</DataTemplate>

そしてあなたのメニュー:

<Menu ItemsSource="{Binding ListOfMyMenuItems}" />
于 2012-06-15T15:45:53.890 に答える
1

IValueConverterに変換RoutedCommandsされるa を使用する可能性がありImagesます。その後IValueConverter、グローバル スタイルで使用できます。

XAML は次のようになります。

<Style x:Key="MenuItemBase_Style" TargetType="{x:Type MenuItem}">
    <Setter Property="Icon" Value="{Binding Command,Converter={StaticResource CommandImage_ValueConverter},RelativeSource={RelativeSource Mode=Self}}"/>
</Style>

<Style x:Key="CutMenuItem_Style" BasedOn="{StaticResource MenuItemBase_Style}"  TargetType="{x:Type MenuItem}" >
    <Setter Property="Command" Value="Cut"/>
</Style>
<Style x:Key="CopyMenuItem_Style" BasedOn="{StaticResource MenuItemBase_Style}"  TargetType="{x:Type MenuItem}" >
    <Setter Property="Command" Value="Copy"/>
</Style>
<Style x:Key="AnotherMenuItem_Style" ... />

IValueConverterはシンプルですが、他のものにも拡張できます。Styleパラメータとして a を指定できるように記述しました。これは、返された を操作する場合に便利ですImage

public class CommandImageValueConverter : IValueConverter{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        if (value == null) return null;
        var cmd = value as RoutedCommand;
        if (null != cmd) {                
            var uri = new Uri("/YourComponent;component/Image/" + cmd.Name + "_16_16.png", UriKind.Relative);                
            return new Image() { Stretch = Stretch.None ,Source=Load(uri),Style=parameter as Style};                
        }            
        throw new NotImplementedException("Conversion from " + value.GetType().Name + " is currently not supported");
    }

    public static ImageSource Load(Uri uri) {
        BitmapImage bi = new BitmapImage();
        bi.BeginInit();
        bi.UriSource = uri;
        bi.EndInit();
        return bi;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        throw new NotImplementedException();
    }
}

も1 回宣言するIValueConverter必要があります。

<yourNamespace:CommandImageValueConverter x:Key="CommandImage_ValueConverter"/>

これが他の誰かに役立つことを願っています。

于 2012-06-15T19:20:17.590 に答える