2009-03-13 18 views
9

WPFのContextMenuのデフォルトのスタイルを変更しようとしています。デフォルトのContextMenuスタイル - WPF

通常、コントロールブレンドの編集(テンプレート)>コピーの編集メニューオプションを使用して、デフォルトのコピーを作成できます。しかし、私はContextMenuでこれを行う方法を考えることができません。どのように私はどのようにデフォルトのスタイルを変更することができますか?

アイコンが通常表示されるコンテキストメニューの左側を無効にしようとしています。

ありがとうございます!

更新:私はアイコンを削除することが明らかでなかったかもしれません。たとえば、アイコンのないコンテキストメニューを使用している場合、メニューの左側全体が無駄になります。私はこれを削除するコンテキストメニューの背景のデフォルトのスタイルを変更したいと思います。単に私はこのデフォルトスタイルにアクセスする方法を知らないだけです。

+0

ルーク、この問題を解決しましたか?私は以下のすべての異なるアイデアで少し混乱しています。ヒントありがとう! –

+0

はい、私はテンプレートを取得し、そこから変更するために、以下の答えを使用しました。 – Luke

答えて

10

Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder 
Using Writer As TextWriter = New StringWriter(sb) 
    System.Windows.Markup.XamlWriter.Save(ContextMenu.Template, Writer) 
End Using 
Debug.Write(sb.ToString) 

またはC#で

var str = new StringBuilder(); 
using (var writer = new StringWriter(str)) 
    XamlWriter.Save(ContextMenu.Template, writer); 
Debug.Write(str); 
+4

ContextMenuでテンプレートを取得するには、少なくとも1つのMenuItemをItemsコレクションに追加する必要があります。それ以外の場合、ContextMenu.Templateはnullです。 –

+0

私はスタックオーバーフローが大好きです。これらの回答には本当に感謝しています。 – scobi

2

実際には、スペースはContextMenuの一部ではなく、MenuItemの一部です。したがって、MenuItemを式ブレンドのウィンドウにドラッグし、コントロールのコピーを作成します。あなたのContextMenuの宣言が次のようになることを願っています。.ContentTemplate内には、以下のようなスペースがあります。したがって、スクリーンショットでマークしたグリッドのアイコンと最初の列を削除します。

alt text

+0

これは私にはMenuItemのデフォルトのスタイルを取得しますが、ContextMenuスタイルは得られません。 Expression BlendではContextMenuをウィンドウに追加することはできません。 – Luke

+0

ContextMenuをウィンドウに追加すると、「ContextMenuは論理的または視覚的な親を持つことができません」というエラーが表示されます。 – Luke

+0

はい、左側のメニューのContextMenuには、削除が必要なスタイルもあります。 Expressionインターフェイスを使ってアクセスできないContextMenuスタイルです。私はコードを使用してテンプレートを抽出する以下のソリューションを投稿しました。 – Luke

0

左の余分なスペースを使用すると、MenuItemtrueIsCheckableIsCheckedを設定したときに表示される小さなチェックマークによるものです。

チェックマークはテンプレートのMenuItemにありますので、編集するとそれを取り出すことができます。

テンプレートを抽出するために、次のコードを使用することができます(例えばたContextMenuテンプレートなど)式インタフェースを介してアクセスすることはできませんテンプレートとスタイルのために
+0

'IsCheckable'プロパティは、チェック/アイコン領域がメニューに表示されるかどうかではなく、メニュー項目とのユーザーのやりとりに影響します。実際、デフォルト値は既に 'False'です。 'True'に設定すると、ユーザーがそのメニュー項目を選択するたびにチェックマークが自動的に切り替わります。 –

7

BlendでContextMenuテンプレートを取得する簡単な方法が見つかりました:

  1. 私はContextMenuをbuttoに追加しました。いくつかのメニュー項目がある。
  2. プロパティペインの「その他」には、ContextMenuのグループ化された項目があります。
  3. これを開きます。通常のスタイルとテンプレートのプロパティがあります。
  4. は...それだけです

をポップアップメニューの四角をクリックして、新しいリソースに変換]を選択します。テンプレート/スタイルを挿入する場所を選択すると、完了です。

ここで私が持っていたマークアップです:

<StackPanel x:Name="LayoutRoot"> 
    <Button Content="Click for ContextMenu" Width="30" HorizontalAlignment="Center" VerticalAlignment="Center"> 
     <Button.ContextMenu> 
      <ContextMenu Template="{DynamicResource ContextMenuControlTemplate1}" Style="{DynamicResource ContextMenuStyle1}"> 
       <MenuItem Header="File"/> 
       <MenuItem Header="Edit"/> 
       <MenuItem Header="View"/> 
       <MenuItem Header="Recent Files"/> 
        <MenuItem Header="file1.txt"/> 
        <MenuItem Header="file2.txt"/> 
      </ContextMenu> 
     </Button.ContextMenu> 
    </Button> 
</StackPanel> 

そして、私が得たスタイル/テンプレート:

<Style x:Key="ContextMenuStyle1" TargetType="{x:Type ContextMenu}"> 
    <Setter Property="Background" Value="{DynamicResource MenuBackgroundBrush}"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="BorderBrush" Value="{DynamicResource WindowBorderBrush}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ContextMenu}"> 
       <Border Uid="Border_93"> 
        <Border.Style> 
         <Style TargetType="{x:Type Border}"> 
          <Setter Property="Tag" Value="{DynamicResource {x:Static SystemParameters.DropShadowKey}}"/> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="True"> 
            <Setter Property="Background" Value="Transparent"/> 
            <Setter Property="Padding" Value="0,0,5,5"/> 
            <Setter Property="Effect"> 
             <Setter.Value> 
              <DropShadowEffect BlurRadius="4" Opacity="0.8" ShadowDepth="1"/> 
             </Setter.Value> 
            </Setter> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Border.Style> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

・ホープ、このことができます。通常のMSの徹底では、デフォルトスタイルのブラシは見つかりません。 :)

+0

ハハ!:* Blend *でContextMenuテンプレートを取得する簡単な方法を見つけました。これは確かに簡単な方法です! – bgmCoder

+3

完全なXAMLではないようです。 'ContextMenuControlTemplate1'の定義はどこですか? –

2

これを試してください:(このコードをXAMLのResources部分に入れてください)これによりコンテキストメニューからアイコンストリップが削除されます。

<Style TargetType="{x:Type ContextMenu}"> 
    <Setter Property="OverridesDefaultStyle" Value="True" /> 
    <Setter Property="SnapsToDevicePixels" Value="True" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ContextMenu}"> 
       <Border BorderThickness="1" CornerRadius="4" BorderBrush="Black" x:Name="Border" Background="White"> 
        <StackPanel ClipToBounds="True" Orientation="Vertical" IsItemsHost="True" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="true"> 
         <Setter TargetName="Border" Property="Background" Value="White" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
関連する問題