none
统一设置 ToolTip 隐藏或显示 RRS feed

  • 问题

  • 自定义几个usercontrol,设置了ToolTip 。

    创建了很多个 usercontrol对象,现在想通过1个按钮,统一设置所有的对象(类型不同),显示或者不显示ToolTip 。

    我知道可以用循环遍历去逐个设置对象的ToolTip 的Visibility="Hidden",但觉得太过繁琐,请问有简单的方法吗?


    2011年6月30日 3:18

答案

  • 你好,黑心

    很高兴能够帮助你,根据我对你问题描述的理解,认为数据绑定是解决你问题的一种方法。

    其原理是:将各个需要同步改变的ToolTipVisibility属性绑定到后台定义的

    属性IsToolTipVisible上,同时将该属性绑定到ToggleButtonIschecked属性上,当Ischecked被改变时,IsToolTipVisible通知UI中绑定的所有ToolTip,达到同步的效果。

    其中,需要注意的是

    一、IsToolTipVisible变量需要有一个notify的事件监测,当IsToolTipVisible值发生改变时才能自动通知前台改变UI

    二、Visibility不是布尔类型的,所以当你绑定Visibility属性到IsToolTipVisible属性时要注意类型转换,可以定义一个Convert函数来完成类型的转换

    以下是我实现的ToolTip,绑定visibility属性的部分代码,给你作为参考:

    XAML:

        <Window.Resources>

            <local:VisibilityConverter x:Key="vCon"/>

        </Window.Resources>

        <Grid Height="257">

            <TextBlock Name="TextBlock1" Height="23"  HorizontalAlignment="Left" Margin="139,89,0,0" Text="TextBlock" VerticalAlignment="Top">

            <TextBlock.ToolTip>

                <ToolTip Visibility="{Binding Path=IsToolTipVisible, Converter={StaticResource vCon}}"  Name="Tooltip1">

                    <StackPanel>

                        <TextBlock>hello1</TextBlock>

                    </StackPanel>

                </ToolTip>

            </TextBlock.ToolTip>

            </TextBlock>

            <TextBlock Name="TextBlock2" Height="23" HorizontalAlignment="Left" Margin="139,151,0,0" Text="TextBlock" VerticalAlignment="Top" >

            <TextBlock.ToolTip >

                    <ToolTip  Visibility="{Binding Path=IsToolTipVisible, Converter={StaticResource vCon}}"  Name="Tooltip2">

                    <StackPanel>

                        <TextBlock>hello2</TextBlock>

                    </StackPanel>

                    </ToolTip>

                </TextBlock.ToolTip>

            </TextBlock>

            <ToggleButton Checked="tglBtn_Checked" Unchecked="tglBtn_Unchecked" Height="23" HorizontalAlignment="Left" Margin="284,115,0,0"

                          Name="tglBtn" IsChecked="{Binding IsToolTipVisible}"></ToggleButton>

        </Grid>

     

    Code Behind:

    

    private bool _isvisible =true;

            public bool IsToolTipVisible

            {

                get { return this._isvisible; }

     

                set

                {

                    if (value != this._isvisible)

                    {

                        this._isvisible = value;

                        NotifyPropertyChanged("IsToolTipVisible");

                    }

                }

            }

     

            public MainWindow()

            {

                InitializeComponent();

               

                this.DataContext = this;

            }

          

        public event PropertyChangedEventHandler PropertyChanged;

     

            private void NotifyPropertyChanged(String info)

            {

                if (PropertyChanged != null)

                {

                    PropertyChanged(this, new PropertyChangedEventArgs(info));

                }

            }

     

            private void tglBtn_Checked(object sender, RoutedEventArgs e)

            {

                tglBtn.Content = "Show ToolTips";           

            }

     

            private void tglBtn_Unchecked(object sender, RoutedEventArgs e)

            {

                tglBtn.Content = "Hide ToolTips";

            }

     

        }

     

        public class VisibilityConverter : IValueConverter

        {

            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)

            {

                return (bool)value ? Visibility.Visible : Visibility.Collapsed; ;

            }

     

            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)

            {

     

                return ((Visibility)value == Visibility.Visible ? true : false);

            }

        }

     

    如果你想得到一个完整的实例,请参见 https://skydrive.live.com/#!/?cid=0b578b4d6ded9b93&sc=documents&id=B578B4D6DED9B93%21107

    
     

    Annabella Luo [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年7月4日 9:05
    版主

全部回复

  • 也许可用用绑定实现,但没试过,不知道是否会比挨个设置简单些
    2011年7月2日 8:41
  • 你好,黑心

    很高兴能够帮助你,根据我对你问题描述的理解,认为数据绑定是解决你问题的一种方法。

    其原理是:将各个需要同步改变的ToolTipVisibility属性绑定到后台定义的

    属性IsToolTipVisible上,同时将该属性绑定到ToggleButtonIschecked属性上,当Ischecked被改变时,IsToolTipVisible通知UI中绑定的所有ToolTip,达到同步的效果。

    其中,需要注意的是

    一、IsToolTipVisible变量需要有一个notify的事件监测,当IsToolTipVisible值发生改变时才能自动通知前台改变UI

    二、Visibility不是布尔类型的,所以当你绑定Visibility属性到IsToolTipVisible属性时要注意类型转换,可以定义一个Convert函数来完成类型的转换

    以下是我实现的ToolTip,绑定visibility属性的部分代码,给你作为参考:

    XAML:

        <Window.Resources>

            <local:VisibilityConverter x:Key="vCon"/>

        </Window.Resources>

        <Grid Height="257">

            <TextBlock Name="TextBlock1" Height="23"  HorizontalAlignment="Left" Margin="139,89,0,0" Text="TextBlock" VerticalAlignment="Top">

            <TextBlock.ToolTip>

                <ToolTip Visibility="{Binding Path=IsToolTipVisible, Converter={StaticResource vCon}}"  Name="Tooltip1">

                    <StackPanel>

                        <TextBlock>hello1</TextBlock>

                    </StackPanel>

                </ToolTip>

            </TextBlock.ToolTip>

            </TextBlock>

            <TextBlock Name="TextBlock2" Height="23" HorizontalAlignment="Left" Margin="139,151,0,0" Text="TextBlock" VerticalAlignment="Top" >

            <TextBlock.ToolTip >

                    <ToolTip  Visibility="{Binding Path=IsToolTipVisible, Converter={StaticResource vCon}}"  Name="Tooltip2">

                    <StackPanel>

                        <TextBlock>hello2</TextBlock>

                    </StackPanel>

                    </ToolTip>

                </TextBlock.ToolTip>

            </TextBlock>

            <ToggleButton Checked="tglBtn_Checked" Unchecked="tglBtn_Unchecked" Height="23" HorizontalAlignment="Left" Margin="284,115,0,0"

                          Name="tglBtn" IsChecked="{Binding IsToolTipVisible}"></ToggleButton>

        </Grid>

     

    Code Behind:

    

    private bool _isvisible =true;

            public bool IsToolTipVisible

            {

                get { return this._isvisible; }

     

                set

                {

                    if (value != this._isvisible)

                    {

                        this._isvisible = value;

                        NotifyPropertyChanged("IsToolTipVisible");

                    }

                }

            }

     

            public MainWindow()

            {

                InitializeComponent();

               

                this.DataContext = this;

            }

          

        public event PropertyChangedEventHandler PropertyChanged;

     

            private void NotifyPropertyChanged(String info)

            {

                if (PropertyChanged != null)

                {

                    PropertyChanged(this, new PropertyChangedEventArgs(info));

                }

            }

     

            private void tglBtn_Checked(object sender, RoutedEventArgs e)

            {

                tglBtn.Content = "Show ToolTips";           

            }

     

            private void tglBtn_Unchecked(object sender, RoutedEventArgs e)

            {

                tglBtn.Content = "Hide ToolTips";

            }

     

        }

     

        public class VisibilityConverter : IValueConverter

        {

            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)

            {

                return (bool)value ? Visibility.Visible : Visibility.Collapsed; ;

            }

     

            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)

            {

     

                return ((Visibility)value == Visibility.Visible ? true : false);

            }

        }

     

    如果你想得到一个完整的实例,请参见 https://skydrive.live.com/#!/?cid=0b578b4d6ded9b93&sc=documents&id=B578B4D6DED9B93%21107

    
     

    Annabella Luo [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年7月4日 9:05
    版主
  • 斑竹太客气了,真是好人,谢谢啦
    2011年7月5日 1:29
  • 有什么问题可以再提出来,我们会尽力帮你解答的。加油!


    Annabella Luo [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年7月5日 9:11
    版主