programing

WPF 버튼의 디폴트 마우스 오버 효과를 삭제하려면 어떻게 해야 합니까?

codeshow 2023. 4. 12. 22:40
반응형

WPF 버튼의 디폴트 마우스 오버 효과를 삭제하려면 어떻게 해야 합니까?

WPF에서는 트리거나 애니메이션을 사용하여 버튼의 배경색을 변경하려고 할 때마다 기본 마우스 오버 효과(주황색 글로우가 회색으로 표시됨)가 우선되는 것 같습니다.

광범위한 검색 결과 이 효과를 제거하는 방법을 알 수 없습니다.

이는 Mark Heath가 언급한 솔루션과 유사하지만 애니메이션 위에 마우스를 붙이지 않고 매우 기본적인 버튼을 만들기 위한 코드 수는 많지 않습니다.버튼 테두리를 검은색으로 표시하는 효과보다 단순한 마우스를 유지합니다.

스타일은 윈도우에 삽입할 수 있습니다.[ Resources 。예를 들어 [Resources]섹션(표시)입니다.

<UserControl.Resources>
    <!-- This style is used for buttons, to remove the WPF default 'animated' mouse over effect -->
    <Style x:Key="MyButtonStyle" TargetType="Button">
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="Margin" Value="5"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border Name="border" 
                        BorderThickness="1"
                        Padding="4,2" 
                        BorderBrush="DarkGray" 
                        CornerRadius="3" 
                        Background="{TemplateBinding Background}">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="border" Property="BorderBrush" Value="Black" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

<!-- usage in xaml -->
<Button Style="{StaticResource MyButtonStyle}">Hello!</Button>

매우 간단한 솔루션을 추가하면 충분했습니다.그리고 OP의 문제를 해결할 수 있다고 생각합니다.는 이 답변에서 일반적인 경우를 제외하고 해결책을 사용했다.Background이미지 대신 값을 지정합니다.

<Style x:Key="SomeButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid Background="{TemplateBinding Background}">
                    <ContentPresenter />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

재템플릿은 강제 적용 이외에는 없습니다.Background항상 그 사람일 것Transparent템플릿 버튼의 배경 - 마우스 오버는 이 작업이 완료되면 배경에 더 이상 영향을 주지 않습니다.확실히 치환하다Transparent원하는 값을 지정합니다.

모든 상태의 모양을 완전히 제어하려면 사용자 정의 단추 템플릿을 만들어야 합니다.여기 튜토리얼이 있습니다.

머핀맨은 매우 간단한 대답을 했고, 그것은 나에게 효과가 있었다.

좀 더 구체적인 방향을 추가하려면 적어도 VS 2013의 경우:

  • 컨트롤을 오른쪽 클릭합니다.
  • 템플릿 편집 => 복사본 편집...을 선택합니다.
  • 스타일을 저장할 위치에 대해 '응용 프로그램'을 선택했습니다.
    • 여기서 App.xaml을 직접 편집하여 직관적으로 명명된 속성을 볼 수 있습니다.RenderMouseOver="False"를 설정했을 뿐입니다.
  • 그런 다음 Main Window.xaml 또는 GUI가 있는 곳에서 버튼 태그 끝에 새 스타일을 붙여넣을 수 있습니다.... Style="{DynamicResource MouseOverNonDefault}"/>

이 링크는 많은 도움이 되었습니다.http://www.codescratcher.com/wpf/remove-default-mouse-over-effect-on-wpf-buttons/

UserControl에서 스타일을 정의합니다.[ Resources ]또는 [Window]선택합니다.자원

 <Window.Resources>
        <Style x:Key="MyButton" TargetType="Button">
            <Setter Property="OverridesDefaultStyle" Value="True" />
            <Setter Property="Cursor" Value="Hand" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Name="border" BorderThickness="0" BorderBrush="Black" Background="{TemplateBinding Background}">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Opacity" Value="0.8" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

그런 다음 버튼에 스타일을 추가합니다. Style="{Static Resource MyButton}"

<Button Name="btnSecond" Width="350" Height="120" Margin="15" Style="{StaticResource MyButton}">
    <Button.Background>
        <ImageBrush ImageSource="/Remove_Default_Button_Effect;component/Images/WithStyle.jpg"></ImageBrush>
    </Button.Background>
</Button>

기본 Control Template를 덮어쓰지 않으려면 다음과 같은 해결책이 있습니다.

TextBlock을 사용할 수 있는 버튼의 DataTemplate를 만든 다음 IsMouseOver 속성에 Property 트리거를 작성하여 마우스 오버 효과를 비활성화할 수 있습니다.텍스트 블록과 버튼의 높이는 같아야 합니다.

<Button Background="Black" Margin="0" Padding="0" BorderThickness="0" Cursor="Hand" Height="20">
    <Button.ContentTemplate>
        <DataTemplate>
            <TextBlock Text="GO" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" TextDecorations="Underline" Margin="0" Padding="0" Height="20">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Style.Triggers>
                            <Trigger Property ="IsMouseOver" Value="True">
                                <Setter Property= "Background" Value="Black"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </Button.ContentTemplate>
</Button>

dodgy_coder의 응답에 대한 지원을 추가하는 확장입니다.

  • WPF 버튼 스타일 유지 보수
  • Is Selected 및 호버튼(전환 버튼)에 대한 지원을 추가합니다.

        <Style x:Key="Button.Hoverless" TargetType="{x:Type ButtonBase}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ButtonBase}">
                        <Border Name="border"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                Padding="{TemplateBinding Padding}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                Background="{TemplateBinding Background}">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsMouseOver" Value="True" />
                                    <Condition Property="Selector.IsSelected" Value="False" />
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" Value="#FFBEE6FD" />
                            </MultiTrigger>
    
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsMouseOver" Value="True" />
                                    <Condition Property="Selector.IsSelected" Value="True" />
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" Value="#BB90EE90" />
                            </MultiTrigger>
    
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsMouseOver" Value="False" />
                                    <Condition Property="Selector.IsSelected" Value="True" />
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" Value="LightGreen" />
                            </MultiTrigger>
    
                            <Trigger Property="IsPressed" Value="True">
                                <Setter TargetName="border" Property="Opacity" Value="0.95" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

예..

<Button Content="Wipe On" Selector.IsSelected="True" /> <Button Content="Wipe Off" Selector.IsSelected="False" />

템플릿 트리거 사용:

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Background" Value="White"></Setter>
    ...
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{TemplateBinding Background}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="White"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

언급URL : https://stackoverflow.com/questions/3854317/how-to-remove-default-mouse-over-effect-on-wpf-buttons

반응형