WPF:TextBox의 기본 ContextMenu 스타일을 지정하거나 비활성화하는 방법
문제
분명히 사용자가 WPF 애플리케이션에서 마우스 오른쪽 버튼을 클릭하고 Windows 클래식 테마를 사용하는 경우 TextBox(복사, 잘라내기, 붙여넣기가 포함되어 있음)의 기본 ContextMenu에는 검정색 배경이 있습니다.
나는 이것이 잘 작동한다는 것을 알고 있습니다.
<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의 모든 TextBox에 대해 기본 ContextMenu의 스타일을 지정하거나 비활성화하는 방법을 아는 사람이 있습니까?
해결책 3
늦은 버그 보고서로 인해 우리는 부분적으로 신뢰할 수 있는 응용 프로그램에서 ApplicationComands 잘라내기 붙여넣기 및 복사를 직접 사용할 수 없다는 사실을 발견했습니다.따라서 컨트롤의 모든 명령에서 이러한 명령을 사용하면 실행 시 아무 작업도 수행되지 않습니다.
그래서 본질적으로 Brads의 대답은 거의 거기에 이르렀습니다. 확실히 올바른 방향으로 보였습니다.검정색 배경은 없지만 문제가 해결되지 않았습니다.
우리는 다음과 같이 Brads 답변을 기반으로 메뉴를 "제거"하기로 결정했습니다.
<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" />
그리고 다음과 같이 빈 컨텍스트 메뉴를 사용하세요.
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
다른 팁
모든 TextBox에 대해 ContextMenu의 스타일을 지정하려면 다음과 같은 작업을 수행합니다.
먼저 리소스 섹션에서 텍스트 상자의 표준 ContextMenu로 사용할 ContextMenu를 추가합니다.
예를 들어
<ContextMenu x:Key="TextBoxContextMenu" Background="White">
<MenuItem Command="ApplicationCommands.Copy" />
<MenuItem Command="ApplicationCommands.Cut" />
<MenuItem Command="ApplicationCommands.Paste" />
</ContextMenu>
둘째, 상황에 맞는 메뉴 리소스를 사용하는 TextBox 스타일을 만듭니다.
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
마지막으로 텍스트 상자를 평소처럼 사용하세요.
<TextBox />
대신 이 컨텍스트 메뉴를 일부 텍스트 상자에만 적용하려면 위의 스타일을 만들지 말고 TextBox 마크업에 다음을 추가하세요.
<TextBox ContextMenu="{StaticResource TextBoxContextMenu}" />
도움이 되었기를 바랍니다!
기괴한. ContextMenu="{x:Null}"
트릭을 수행하지 않습니다.
그러나 이는 다음을 수행합니다.
<TextBox.ContextMenu>
<ContextMenu Visibility="Collapsed">
</ContextMenu>
</TextBox.ContextMenu>
TargetType을 그대로 두고 스타일 리소스에서 x:Key 속성을 제거해 보세요.알아요. 리소스에 대해 해당 x:Key가 있어야 하지만 TargetType과 함께 해당 x: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>
상관없습니다. 키를 제공하지 않으면 TargetType
내 예제에서 사용하는 것과 같은 방식으로 키로 :)
스타일의 MSDN에서 가져옴:
설정
TargetType
재산에TextBlock
설정하지 않고 입력하십시오x:Key
암시적으로x:Key
에게{x:Type TextBlock}
.이는 또한 > > 위의 스타일에x:Key
그 이외의 것의 가치{x:Type TextBlock}
, 스타일은 모든 텍스트 블록 요소에 자동으로 적용되지 않습니다.대신 스타일을TextBlock
요소를 명시적으로 지정합니다.
http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx
이것이 내가 항상 사용하는 방법입니다.
<TextBox x:Name="MyTextbox">
<TextBox.ContextMenu>
<ContextMenu Visibility="Hidden"/>
</TextBox.ContextMenu>
</TextBox>
또한 다음을 사용할 수도 있습니다.
MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
MyTextbox.ContextMenu.Visibility = Visibility.Visble;