2011-10-17 3 views
3

Button 및 ComboBox가 포함 된 WPF UserControl을 만들었습니다. 마우스의 위치에 따라 두 가지 스타일을 변경하고 싶습니다. 마우스가있는 UIElement는 검정색으로, 다른 UIElement는 빨강으로 표시됩니다. 둘 다 스타일이 지정되지 않으면 기본 스타일이 적용됩니다.WPF UserControls; 트리거 및 다른 컨트롤 변경

걱정하지 마세요.이 악몽 같은 색 구성표는 개념을 설명하기위한 것입니다.

미리 도움을 주셔서 감사합니다.

XAML

<UserControl x:Class="WpfUserControlSample.ToolbarButtonCombo" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:WpfUserControlSample" 
      x:Name="Control" 
      mc:Ignorable="d" 
      d:DesignHeight="30">  
    <UserControl.Resources> 
     <Style TargetType="{x:Type local:ToolbarButtonCombo}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsButtonMouseOver}" Value="True"> 
        <Setter Property="ButtonStyle" Value="Black"/> 
        <Setter Property="ComboStyle" Value="Red"/>      
       </DataTrigger> 
       <!-- 
       <DataTrigger Binding="{Binding IsComboMouseOver}" Value="True"> 
        <Setter Property="ButtonStyle" Value="Red"/> 
        <Setter Property="ComboStyle" Value="Black"/> 
       </DataTrigger> 
       --> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Orientation="Horizontal" Height="30"> 
     <Button Name="btn" Background="{Binding ButtonStyle,ElementName=Control,Mode=OneWay}"> 
      Test 
     </Button> 
     <ComboBox Name="cmb" Background="{Binding ComboStyle,ElementName=Control,Mode=OneWay}"></ComboBox> 
    </StackPanel> 
</UserControl> 

Codebehind가는 :

namespace WpfUserControlSample 
{ 
    public partial class ToolbarButtonCombo : UserControl, INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     protected void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 

     } 
     public ToolbarButtonCombo() 
     { 
      InitializeComponent(); 
      btn.MouseEnter += new MouseEventHandler(btn_MouseChanged); 
      btn.MouseLeave += new MouseEventHandler(btn_MouseChanged); 
     } 
     void btn_MouseChanged(object sender, MouseEventArgs e) 
     { 
      OnPropertyChanged("IsButtonMouseOver"); 
     } 


     public bool IsButtonMouseOver 
     { 
      get { return btn.IsMouseOver; } 

     } 
     public static readonly DependencyProperty IsButtonMouseOverProperty = 
      DependencyProperty.Register("IsButtonMouseOver", typeof(string), typeof(ToolbarButtonCombo), new PropertyMetadata("false")); 

     public string ButtonStyle { get; set; } 
     public static readonly DependencyProperty ButtonStyleProperty = 
      DependencyProperty.Register("ButtonStyle", typeof(string), typeof(ToolbarButtonCombo)); 

     public string ComboStyle { get; set; } 
     public static readonly DependencyProperty ComboStyleProperty = 
      DependencyProperty.Register("ComboStyle", typeof(string), typeof(ToolbarButtonCombo));  
    } 
} 
+1

IsButtonMouseOver에 중단 점을 넣거나 반환하기 전에 Console.WriteLine을 추가하면 결코 호출되지 않는다는 것을 알 수 있습니다.이 부분은 이상하게 보입니다. 제대로 연결되어 있다고는 생각하지 않습니다. 실제 IsMouseOver. 개인적으로 할 수만 있다면 IsMouseOver 속성으로 일반 트리거를 직접 사용 하겠지만 초보자이며 기존 코드를 변경하는 방법을 알지 못합니다. 행운을 빕니다. – Pierre

답변

2

는 두 가지 문제가 있습니다.

먼저 DataTrigger 바인딩이 올바르게 보이지 않습니다. DataContext에서 연결된 컨트롤이 아닌 IsButtonMouseOver를 찾고 있습니다. 당신은 사용해야 할 것 :

<DataTrigger Binding="{Binding IsButtonMouseOver, RelativeSource={RelativeSource Self}}" Value="True"> 
    <Setter Property="ButtonStyle" Value="Black"/> 
    <Setter Property="ComboStyle" Value="Red"/>      
</DataTrigger> 

또는를 :

<Trigger Property="IsButtonMouseOver" Value="True"> 
    <Setter Property="ButtonStyle" Value="Black"/> 
    <Setter Property="ComboStyle" Value="Red"/>      
</Trigger> 

다른 하나는 당신의 IsButtonMouseOver가 제대로 구현되지 않은 것입니다. 더욱 정확하게

public static readonly DependencyProperty IsButtonMouseOverProperty = DependencyProperty.Register("IsButtonMouseOver", 
    typeof(bool), typeof(ToolbarButtonCombo), new PropertyMetadata(false)); 

    public bool IsButtonMouseOver 
    { 
     get { return (bool)this.GetValue(IsButtonMouseOverProperty); } 
     set { this.SetValue(IsButtonMouseOverProperty, value); } 
    } 

    void btn_MouseChanged(object sender, MouseEventArgs e) 
    { 
     this.IsButtonMouseOver = this.btn.IsMouseOver; 
    } 

또는 IsButtonMouseOver 읽기 전용과 같이 종속성 속성합니다 : 당신은 뭔가를해야 제대로 할 필요가

private static readonly DependencyPropertyKey IsButtonMouseOverPropertyKey = DependencyProperty.RegisterReadOnly("IsButtonMouseOver", 
    typeof(bool), typeof(ToolbarButtonCombo), new FrameworkPropertyMetadata(false)); 

public static readonly DependencyProperty IsButtonMouseOverProperty = ToolbarButtonCombo.IsButtonMouseOverPropertyKey.DependencyProperty; 

public bool IsButtonMouseOver { 
    get { return (bool)this.GetValue(IsButtonMouseOverProperty); } 
    private set { this.SetValue(IsButtonMouseOverPropertyKey, value); } 
} 

귀하의 다른 속성 (ButtonStyle 및 ComboStyle) 또한 구현되고, get/set 메소드는 의존성 프로퍼티에 의해지지되지 않는다.

+0

잘 작동합니다. 이제 어디서 잘못되었는지 볼 수 있습니다. 고마워요! –

관련 문제