WPF:TextBox의 기본 ContextMenu 스타일을 지정하거나 비활성화하는 방법

StackOverflow https://stackoverflow.com/questions/9632

  •  08-06-2019
  •  | 
  •  

문제

분명히 사용자가 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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top