클릭 후 WPF 버튼이 강조 표시된 상태로 유지되지 않도록 하려면 어떻게 해야 합니까?
표준 WPF 버튼을 클릭하면 파란색으로 강조 표시되고(아마 Windows 테마가 설정되어 있는 파란색을 사용), 다른 컨트롤과 상호 작용할 때까지 강조 표시된 상태로 유지됩니다.내 앱은 사용자에게 혼란을 준다.
이 버튼을 끄고 원래 스타일로 되돌릴 수 있는 간단한 방법이 있나요?사용하고 있습니다.넷 4
버튼은 클릭 후 다른 컨트롤이 클릭할 때와 마찬가지로 입력 포커스를 받아들입니다.
Windows 에서는, 적어도 Aero 테마아래에서, 컨트롤에 입력 포커스가 있는 것을 나타내는 방법은, 은은한 파란색의 하이라이트입니다.
특히 버튼 컨트롤의 경우 입력 포커스가 있을 때 키를 누르는 것만으로 버튼을 "누른다"고 할 수 있습니다.그렇기 때문에 하이라이트를 유지하는 것이 매우 중요하므로 사용자는 무엇을 기대할 수 있습니다.
사용자가 버튼을 클릭한 직후에 포커스를 창의 다른 컨트롤로 설정하는 것이 좋습니다.그러면 사용자가 키를 눌렀을 때 자동으로 강조 표시되지 않고 작업이 자동으로 트리거되지 않습니다. (이것은 사용자가 아직 모르는 경우에도 해결하려고 하는 실제 사용상의 문제입니다.사용자가 실제로 무언가를 입력하려고 할 때 실수로 버튼을 클릭하는 것만큼 혼란스러운 것은 없습니다.)
속성을 false로 설정하면 버튼의 포커스가 전혀 잡히지 않도록 할 수 있지만, 저는 이에 대해 매우 추천합니다.이렇게 하면 사용자가 키보드만 사용하여 버튼을 "누르는" 방법은 없습니다.잘 설계된 애플리케이션은 마우스를 사용하지 않거나 사용할 수 없는 사용자가 항상 액세스할 수 있어야 합니다.
false로 설정합니다.버튼은 클릭할 수 있지만 포커스는 유지되지 않습니다.
Aero 버튼의 포커스가 있는 경우의 디폴트 표시입니다.다음 중 하나를 설정할 수 있습니다.Focusable="False"또는 단추에 포커스가 있을 때 다르게 렌더링되지 않는 사용자 스타일을 사용합니다.예를 들어 다음과 같습니다.
xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
<Style x:Key="BaseButtonStyle" TargetType="{x:Type ButtonBase}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ButtonBase}">
<theme:ButtonChrome Name="Chrome" Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}" RenderDefaulted="{TemplateBinding Button.IsDefaulted}"
RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}"
SnapsToDevicePixels="true">
<ContentPresenter Margin="{TemplateBinding Padding}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</theme:ButtonChrome>
<ControlTemplate.Triggers>
<!--
Do not show blue when focused
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter TargetName="Chrome" Property="RenderDefaulted" Value="true" />
</Trigger>-->
<Trigger Property="ToggleButton.IsChecked" Value="true">
<Setter TargetName="Chrome" Property="RenderPressed" Value="true" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#ADADAD" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="{x:Type ToggleButton}" BasedOn="{StaticResource BaseButtonStyle}" TargetType="{x:Type ToggleButton}" />
<Style x:Key="{x:Type RepeatButton}" BasedOn="{StaticResource BaseButtonStyle}" TargetType="{x:Type RepeatButton}" />
<Style x:Key="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}" TargetType="{x:Type Button}" />
Presentation Framework에 대한 참조를 추가해야 합니다.Aero.dll
그것은 단순히 집중된 상태이다.이 기능을 끄려면 포커스 상태를 변경해야 합니다.블렌드를 사용하면 가장 편리합니다.
키보드 사용에 방해가 되므로 Focusable을 false로 설정하지 않는 것이 좋습니다.
<Style x:Key="TouchButton" TargetType="{x:Type Button}">
<Setter Property="IsTabStop" Value="false"/>
<Setter Property="Focusable" Value="false"/>
<Setter Property="ClickMode" Value="Press"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="Border" CornerRadius="2" BorderThickness="1" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}">
<ContentPresenter Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="True"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Button.IsMouseOver" Value="True">
<Setter TargetName="Border" Property="Background" Value="Red"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
저도 비슷한 걸 해야 되는데 런타임 코드에서는 이렇게 되어있었어요.
//You can get this XAML by using System.Windows.Markup.XamlWriter.Save(yourButton.Template)";
const string controlXaml = "<ControlTemplate TargetType=\"ButtonBase\" " +
"xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" " +
"xmlns:s=\"clr-namespace:System;assembly=mscorlib\" " +
"xmlns:mwt=\"clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero\">" +
"<mwt:ButtonChrome Background=\"{TemplateBinding Panel.Background}\" " +
"BorderBrush=\"{TemplateBinding Border.BorderBrush}\" " +
"RenderDefaulted=\"{TemplateBinding Button.IsDefaulted}\" " +
//"RenderMouseOver=\"{TemplateBinding UIElement.IsMouseOver}\" " +
"RenderPressed=\"{TemplateBinding ButtonBase.IsPressed}\" Name=\"Chrome\" SnapsToDevicePixels=\"True\">" +
"<ContentPresenter RecognizesAccessKey=\"True\" " +
"Content=\"{TemplateBinding ContentControl.Content}\" " +
"ContentTemplate=\"{TemplateBinding ContentControl.ContentTemplate}\" " +
"ContentStringFormat=\"{TemplateBinding ContentControl.ContentStringFormat}\" " +
"Margin=\"{TemplateBinding Control.Padding}\" " +
"HorizontalAlignment=\"{TemplateBinding Control.HorizontalContentAlignment}\" " +
"VerticalAlignment=\"{TemplateBinding Control.VerticalContentAlignment}\" " +
"SnapsToDevicePixels=\"{TemplateBinding UIElement.SnapsToDevicePixels}\" /></mwt:ButtonChrome>" +
"<ControlTemplate.Triggers>" +
"<Trigger Property=\"UIElement.IsKeyboardFocused\">" +
"<Setter Property=\"mwt:ButtonChrome.RenderDefaulted\" TargetName=\"Chrome\"><Setter.Value><s:Boolean>True</s:Boolean></Setter.Value></Setter>" +
"<Trigger.Value><s:Boolean>True</s:Boolean></Trigger.Value></Trigger>" +
"<Trigger Property=\"ToggleButton.IsChecked\">" +
"<Setter Property=\"mwt:ButtonChrome.RenderPressed\" TargetName=\"Chrome\"><Setter.Value><s:Boolean>True</s:Boolean></Setter.Value></Setter>" +
"<Trigger.Value><s:Boolean>True</s:Boolean></Trigger.Value></Trigger>" +
"<Trigger Property=\"UIElement.IsEnabled\"><Setter Property=\"TextElement.Foreground\"><Setter.Value><SolidColorBrush>#FFADADAD</SolidColorBrush></Setter.Value></Setter>" +
"<Trigger.Value><s:Boolean>False</s:Boolean></Trigger.Value></Trigger></ControlTemplate.Triggers>" +
"</ControlTemplate>";
var xamlStream = new MemoryStream(System.Text.Encoding.Default.GetBytes(controlXaml));
var _buttonControlTemplate = (ControlTemplate)System.Windows.Markup.XamlReader.Load(xamlStream);
var yourButton = new Button() { Template = _buttonControlTemplate };
'RenderMouseOver' 라인에 코멘트를 하고 있는 것을 알 수 있습니다.
첫 번째 희망은 Framework Element Factory를 사용하는 것이었습니다만, 모든 디폴트 템플릿을 작성할 필요가 있었습니다.★★★★★★★★★★★★★★★★★★★★★★;
「」를 사용합니다.
System.Windows.Markup.XamlWriter.Save(myButton.Template)
원하는 템플릿이 제공되어 Render 섹션을 쉽게 삭제할 수 있습니다.
2단계 솔루션을 찾았습니다.해결방법은 조금 웃기지만 효과가 있습니다.제 레퍼런스 포스트는
모든 컨트롤에서 글로벌 FocusVisualStyle을 제거하려면 어떻게 해야 합니까?
및 C# WPF 어플리케이션.NET 4.5 마우스 위치 설정
WPF는 마우스 커서 이동을 직접 지원하지 않기 때문에 1개의 DLL을 Import해야 합니다.
- 시스템을 추가합니다.런타임네임스페이스에 대한 상호 운용 서비스
- 메인 창 또는 다른 창 코드에 두 줄을 추가합니다.
[DllImport("User32.dll")] private static extern bool SetCursorPos(int X, int Y);
- 이 두 합니다.
SetCursorPos(0, 0); ButtonName.FocusVisualStyle = null;
나는 효과가 있다.
제 경우 MultiTrigger를 사용하여 이 상황을 해결하고 상태를 다음과 같이 설정합니다.
<MultiTrigger.Conditions>
<Condition Property="IsFocused" Value="True"/>
<Condition Property="IsPressed" Value="False"/>
</MultiTrigger.Conditions>
자세한 내용은 이 링크를 참조하십시오.
언급URL : https://stackoverflow.com/questions/5950309/how-do-i-prevent-wpf-buttons-from-remaining-highlighted-after-being-clicked
'source' 카테고리의 다른 글
| Windows의 Postgresql 구성 파일 'postgresql.conf'는 어디에 있습니까? (0) | 2023.04.12 |
|---|---|
| Realm Swift: 결과를 Swift Array로 변환 (0) | 2023.04.12 |
| 목록에서 무작위로 50개 항목 선택 (0) | 2023.04.12 |
| SQL Server - 트랜잭션 롤백 오류 발생? (0) | 2023.04.07 |
| SQL Server의 숨겨진 기능 (0) | 2023.04.07 |