2008-08-13 24 views
25

Được bảo vệ khi người dùng nhấp chuột phải vào ứng dụng WPF của chúng tôi và họ sử dụng chủ đề Windows Classic, ContextMenu mặc định của TextBox (có chứa Sao chép, Cắt và Dán) có một nền đen.WPF: Cách tạo kiểu hoặc tắt ContextMenu mặc định của TextBox

Tôi biết điều này hoạt động tốt:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 

     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <TextBox ContextMenu="{x:Null}"/> 

</Page> 

Nhưng điều này không làm việc:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

<Page.Resources> 

<Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}"> 
    <Setter Property="ContextMenu" Value="{x:Null}"/> 
</Style> 
</Page.Resources> 

    <TextBox/> 
</Page> 

Có ai biết làm thế nào để tạo kiểu hoặc tắt ContextMenu mặc định cho tất cả các hộp thoại trong WPF?

+0

không bạn không cần xem xét các phím tắt vô hiệu hóa, ví dụ CTRL-V? –

Trả lời

7

Do báo cáo lỗi muộn, chúng tôi phát hiện ra rằng chúng tôi không thể sử dụng tính năng Cắt dán ứng dụng và dán trực tiếp trong ứng dụng đáng tin cậy một phần.Do đó, việc sử dụng các lệnh này trong bất kỳ Commmand nào của các điều khiển của bạn sẽ hoàn toàn không có gì khi thực hiện.

Vì vậy, trong bản chất câu trả lời của Brads gần như ở đó, chắc chắn nó đã nhìn đúng cách, tức là không có nền đen, nhưng không khắc phục được sự cố.

Chúng tôi đã quyết định "loại bỏ" menu dựa trên Brads câu trả lời, như vậy:

<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" /> 

Và sử dụng menu ngữ cảnh trống này như sau:

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" /> 
</Style> 
+0

hoặc bạn có thể sử dụng , cũng hoạt động. – joedotnot

+0

Ngoài ra, đặt 'IsEnabled' trên ContextMenu thành' false' tránh vấn đề "đóng băng" trọng tâm khi người dùng cố gắng nhấp chuột phải. –

1

Thử xóa thuộc tính khóa x: khỏi tài nguyên Kiểu, để lại TargetType. Tôi biết, bạn phải có x: Khóa cho một tài nguyên, nhưng nếu bạn có nó cùng với TargetType của bạn, chìa khóa chiếm ưu thế.

Dưới đây là một phong cách mẫu mà tôi sử dụng trong một dự án để da tất cả tooltips trong một trong những ứng dụng của tôi (đây là trong App.Resources - thông báo, không có chính)

<Style 
    TargetType="{x:Type ToolTip}"> 
    <Setter 
     Property="Template"> 
     <Setter.Value> 
     <ControlTemplate 
      TargetType="{x:Type ToolTip}"> 
      <Grid 
      Width="{TemplateBinding Width}" 
      Height="{TemplateBinding Height}"> 
      <Rectangle 
       RadiusX="9" 
       RadiusY="9" 
       Stroke="LightGray" 
       StrokeThickness="2"> 
       <Rectangle.Fill> 
       <RadialGradientBrush> 
        <GradientStop /> 
        <GradientStop 
        Color="FloralWhite" 
        Offset="0" /> 
        <GradientStop 
        Color="Cornsilk" 
        Offset="2" /> 
       </RadialGradientBrush> 
       </Rectangle.Fill> 
      </Rectangle> 
      <ContentPresenter 
       Margin="6 4 6 4" /> 
      </Grid> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
1

Không quan trọng, nếu bạn không cung cấp một phím, nó sẽ sử dụng các TargetType như chìa khóa chỉ theo cùng một cách ví dụ của tôi sử dụng :)

Taken từ MSDN trên Kiểu:

Thiết lập TargetType tài sản cho TextBlock loại không cần đặt x:Key đặt ngầm x:Key thành {x:Type TextBlock}. Điều này cũng có nghĩa là nếu bạn>> cung cấp Kiểu trên cho giá trị x:Key của bất kỳ thứ gì khác ngoài {x:Type TextBlock}, thì Kiểu sẽ không được áp dụng cho tất cả các thành phần TextBlock tự động. Thay vào đó, bạn cần áp dụng kiểu dáng cho các phần tử TextBlock một cách rõ ràng.

http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx

28

Để tạo kiểu của ContextMenu cho tất cả các hộp thoại, tôi sẽ làm một cái gì đó như sau:

Đầu tiên, trong phần tài nguyên, thêm một ContextMenu mà bạn có kế hoạch để sử dụng như là tiêu chuẩn ContextMenu của bạn trong một hộp văn bản.
ví dụ:

<ContextMenu x:Key="TextBoxContextMenu" Background="White"> 
    <MenuItem Command="ApplicationCommands.Copy" /> 
    <MenuItem Command="ApplicationCommands.Cut" /> 
    <MenuItem Command="ApplicationCommands.Paste" /> 
</ContextMenu> 

Thứ hai, tạo ra một phong cách cho textbox của bạn, trong đó sử dụng các tài nguyên menu ngữ cảnh:

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" /> 
</Style> 

Cuối cùng, sử dụng hộp văn bản của bạn như bình thường:

<TextBox /> 

Nếu thay vào đó bạn muốn để áp dụng menu ngữ cảnh này cho một số hộp văn bản của bạn, không tạo kiểu ở trên và thêm phần sau vào đánh dấu TextBox của bạn:

<TextBox ContextMenu="{StaticResource TextBoxContextMenu}" /> 

Hy vọng điều này sẽ hữu ích!

+0

Tôi xin lỗi khi vấp phải một lỗi .. Tôi không bao giờ nhận ra nó, nhưng tôi không thể sử dụng ApplicationCommands Cut, Copy và Paste trực tiếp trong phần tin cậy .. Menu này sẽ không hoạt động dưới sự tin tưởng một phần. Nhấp vào mục menu, không hoàn toàn không có gì .. Tôi xin lỗi đã mất gần 18 tháng để khám phá;) – Arcturus

+0

Câu trả lời của bạn đã dẫn tôi đến giải pháp mới của tôi: vô hiệu hóa menu với một menu trống .. Cảm ơn một lần nữa mặc dù cho câu trả lời của bạn! – Arcturus

14

Bizarre. ContextMenu="{x:Null}" không thực hiện thủ thuật.

này không, tuy nhiên:

<TextBox.ContextMenu> 
    <ContextMenu Visibility="Collapsed"> 
    </ContextMenu> 
</TextBox.ContextMenu> 
Các vấn đề liên quan