2009-03-13 4 views
9

WPF에서 ContextMenu의 기본 스타일을 수정하려고합니다.기본 ContextMenu 스타일 - WPF

일반적으로 컨트롤 파트 편집 (템플릿)> 복사본 편집 메뉴 옵션을 사용하여 Expression Blend에서 기본 복사본을 만들 수 있습니다. 그러나 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에서 템플릿을 얻으려면 적어도 하나의 MenuItem을 Items 컬렉션에 추가해야합니다. 그렇지 않으면 ContextMenu.Template이 null입니다. –

+0

스택 오버플로가 좋습니다. 이러한 응답에 대해 너무 고마워, 정확히 내가 필요로하는 것. – scobi

2

사실 공간은 MenuItem의 일부인 ContextMenu의 일부가 아닙니다. 따라서 MenuItem을 표현식 블렌드의 윈도우로 드래그하고 컨트롤의 복사본을 만듭니다.

<ContextMenu > 
    <MenuItem Header="Copy"/> 
    <MenuItem Header="Paste"/> 
    <MenuItem Header="Clear"/> 
</ContextMenu> 

을 다음과 같이의 ContextMenu 선언입니다 그리고 당신의 MenuItem의 ControlTemplate 안에 당신이 울부 짖는 소리로 공간을 볼 수 있기를 바랍니다. 따라서 스크린 샷에 표시된 격자의 아이콘과 첫 번째 열을 제거하십시오.

alt text

+0

그게 나에게 ContextMenu 스타일을 가져다주지는 않지만 MenuItem의 기본 스타일을 얻습니다. 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. butto에 ContextMenu를 추가했습니다. 일부 메뉴가있는 n.
  2. 속성 창에서 "miscellaneous"아래에 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>