2009-03-13 31 views
9

Tôi đang cố sửa đổi kiểu mặc định của ContextMenu trong WPF.Mặc định ContextMenu Style - WPF

Thông thường bạn có thể tạo bản sao của mặc định trong Blendion Expression bằng cách sử dụng tùy chọn Edit Control Parts (Template)> Chỉnh sửa tùy chọn Sao chép. Tuy nhiên tôi không thể làm việc ra làm thế nào để làm điều này với một ContextMenu. Bất kỳ ý tưởng làm thế nào tôi có thể có được phong cách mặc định để sửa đổi?

Tôi đang cố gắng vô hiệu hóa phía bên trái của menu ngữ cảnh nơi các biểu tượng thường được hiển thị.

Cảm ơn!

Cập nhật: Có thể tôi không rõ về việc xóa biểu tượng. Ví dụ, nếu bạn có một trình đơn ngữ cảnh không có biểu tượng thì toàn bộ bên trái của menu là không gian lãng phí. Tôi muốn sửa đổi kiểu mặc định của nền menu ngữ cảnh để loại bỏ điều này. Đơn giản là tôi không biết cách truy cập kiểu mặc định này.

+0

Luke, bạn đã giải quyết được sự cố này chưa? Tôi hơi bối rối bởi tất cả những ý tưởng khác nhau bên dưới. Cảm ơn mọi gợi ý! –

+0

Có, tôi đã sử dụng câu trả lời dưới đây để lấy mẫu và sửa đổi nó từ đó. – Luke

Trả lời

10

Đối với các mẫu và phong cách mà không phải truy cập thông qua giao diện Expression (chẳng hạn như mẫu ContextMenu), bạn có thể sử dụng đoạn mã sau để trích xuất các mẫu:

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) 

Hoặc trong C#

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

Xin lưu ý hơn là để lấy mẫu trong ContextMenu, bạn phải thêm ít nhất một MenuItem vào bộ sưu tập Mặt hàng của nó. Nếu không thì ContextMenu.Template là null. –

+0

Tôi yêu Stack Overflow. Cảm ơn rất nhiều vì những phản hồi này, chính xác những gì tôi cần. – scobi

2

Trên thực tế không gian không phải là một phần của ContextMenu, nó là một phần của MenuItem. Vì vậy, chỉ cần kéo một MenuItem vào cửa sổ của bạn trong pha trộn biểu thức và tạo một bản sao của điều khiển. Hy vọng tuyên bố ContextMenu của bạn như sau

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

Và bên trong MenuItem ControlTemplate bạn có thể nhìn thấy không gian như dưới đây. Vì vậy, loại bỏ các biểu tượng và cột đầu tiên của lưới tôi đánh dấu trong ảnh chụp màn hình.

alt text

+0

Vâng, đó là tôi phong cách mặc định cho MenuItem, tuy nhiên nó không giúp tôi có được phong cách ContextMenu. Expression Blend sẽ không cho phép tôi thêm ContextMenu vào Window. – Luke

+0

Nó cho thấy một lỗi, "ContextMenu không thể có cha mẹ hợp lý hoặc trực quan" nếu tôi thêm ContextMenu vào cửa sổ. – Luke

+0

Có, cũng có các kiểu trong ContextMenu cho menu bên trái cần được loại bỏ. Đó là các kiểu ContextMenu mà tôi không thể truy cập bằng giao diện Expression. Tôi đã đăng một giải pháp dưới đây để trích xuất các mẫu bằng cách sử dụng mã. – Luke

0

Không gian thêm bên trái là do dấu chọn ít xuất hiện khi bạn thiết lập IsCheckableIsChecked để true trên MenuItem.

Dấu kiểm nằm trong mẫu cho MenuItem vì vậy nếu bạn chỉnh sửa rằng bạn có thể lấy nó ra.

+0

Thuộc tính 'IsCheckable' ảnh hưởng đến tương tác của người dùng với một mục menu, không phải là vùng kiểm tra/biểu tượng được hiển thị trong menu. Thực tế, giá trị mặc định đã là 'False'. Đặt nó thành 'True' chỉ đơn giản là trường hợp dấu kiểm để tự động chuyển đổi mỗi khi người dùng chọn mục trình đơn đó. –

7

tôi tìm thấy một cách dễ dàng để có được những mẫu ContextMenu trong Blend:

  1. tôi đã thêm một ContextMenu vào một butto n với một số menuitems.
  2. Dưới "linh tinh" trong ngăn thuộc tính, có một mục được nhóm cho ContextMenu.
  3. Mở ứng dụng này. Bạn sẽ tìm thấy các thuộc tính Kiểu và Mẫu thông thường.
  4. Nhấp vào vuông cho menu popup, và chọn Convert to New Resource ...

Vậy là xong. Chọn nơi bạn muốn đặt mẫu/kiểu và bạn đã hoàn tất.

Dưới đây là đánh dấu tôi đã:

<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> 

Và phong cách/mẫu tôi nhận:

<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> 

Hope this helps. Trong tính toàn vẹn MS thông thường, các cọ vẽ theo kiểu mặc định không được tìm thấy. :)

+0

Ha ha !: * Tôi đã tìm thấy cách dễ dàng để có được mẫu ContextMenu trong Blend * - chắc chắn trông giống như cách dễ nhất! – bgmCoder

+3

Dường như không phải là XAML đầy đủ. Định nghĩa của 'ContextMenuControlTemplate1' ở đâu? –

2

Hãy thử cách này: (Đặt mã này vào phần Tài nguyên của bạn trong XAML) Việc này sẽ xóa dải biểu tượng khỏi menu ngữ cảnh.

<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> 
Các vấn đề liên quan