2008-08-13 71 views
25

Apparantly在我們的WPF應用程序,當用戶單擊鼠標右鍵,以及他們使用Windows經典主題,文本框的默認文本菜單(其中包含複製,剪切和粘貼)有一個黑色的背景。WPF:如何樣式或禁用文本框的默認文本菜單

我知道這非常適用:

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

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

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

</Page> 

但是,這並不工作:

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

有誰知道如何樣式或禁用默認文本菜單在WPF所有文本框?

+0

你不需要考慮禁用快捷鍵,例如CTRL-V? – 2016-01-21 03:00:49

回答

7

由於後期的錯誤報告,我們發現我們不能使用ApplicationComands剪切粘貼並直接複製到部分受信任的應用程序中。因此,在您的控件的任何Commmand中使用這些命令在執行時都不會執行任何操作。

因此,本質上Brads答案几乎存在,它確實看起來是正確的方式,即沒有黑色背景,但沒有解決問題。

我們決定基於布拉德斯回答 「刪除」 菜單,就像這樣:

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

,並使用該空的上下文菜單中,像這樣:

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

嘗試刪除X:從樣式資源鍵屬性,留下的TargetType。我知道,你應該有一個資源的x:Key,但是如果你把它和你的TargetType一起使用,那麼Key就會佔上風。

下面是我在一個項目中使用對皮膚所有的提示我的應用程序的一個樣本的風格(這是App.Resources - 通知,無鑰匙)

<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

不要緊,如果你沒有提供的關鍵,它將使用TargetType關鍵只是我的示例使用:)

從MSDN採取上的樣式是相同的:

設置TargetType屬性設置爲TextBlock型而不 設置一個x:Key隱式設置x:Key{x:Type TextBlock}。這也意味着,如果你>>給上面的樣式比{x:Type TextBlock}其他任何一個x:Key值,樣式 不會自動適用於所有的TextBlock元素。相反, 您需要明確地將樣式應用於TextBlock元素。

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

28

樣式文本菜單的所有文本框,我會做一些這樣的:你打算作爲標準文本菜單中使用

首先,在資源部分,添加一個文本菜單一個文本框。
例如

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

其次,爲您的文本框的樣式,它使用上下文菜單中的資源:

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

最後,用你的文本框爲正常:

<TextBox /> 

相反,如果你想這個上下文菜單隻適用於你的一些文本框,不會產生上述的風格,並添加以下到您的文本框標記:

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

希望這有助於!

+0

我很遺憾偶然發現了一個bug ..我從未意識到這一點,但我不能直接在部分信任中使用ApplicationCommands剪切,複製和粘貼。此菜單在部分信任下不起作用。點擊菜單項,完全沒有任何東西..我很遺憾,花了差不多18個月的時間才發現;) – Arcturus 2010-03-26 13:01:05

+0

您的回答讓我想到了我的新解決方案:禁用空菜單的菜單..再次感謝您的答案! – Arcturus 2010-03-26 13:01:50

14

奇思妙想。 ContextMenu="{x:Null}"沒有辦法。

這個呢,但是:

<TextBox.ContextMenu> 
    <ContextMenu Visibility="Collapsed"> 
    </ContextMenu> 
</TextBox.ContextMenu>