1

3 層の WPF アプリで実行時にツールヒントを編集できるようにする必要があります。(これはおそらく、すべてのユーザーではなく、管理者に許可されます。) 私が望むのは、データベースにツールチップを表示することであり、これを実現するためのさまざまな手法を検討してきました。Josh Smith には、ツールチップ コンバーターを使用した良い例があります (こちら)。ただし、ツールチップを個々の UI コントロールにリンクする必要があるため、各コントロールには一意の識別子が必要です。残念ながら、これは WPF では必要ありません。各コントロールに名前を付けたくありません。どうにかして x:Uid を生成できるという記憶がありますが、その方法を思い出せません。また、各コントロールへのコンバーターを定義する代わりに、何らかの方法でツールチップ メカニズムにフックしたいと考えています。少し高いところを目指しているのかもしれませんが、何かアイデアはありますか?

4

1 に答える 1

1

VisualTreeHelperクラス ( msdn )を使用できます。

このソリューションでは、db から ToolTip を設定する場合は、要素の名前を設定する必要があります。

最初に、db からのデータを保持するクラスを作成する必要があります。

class ToolTipContainer
{
    public string ElementName { get; set; }
    public string ToolTip { get; set; }       
}

次にVisualTreeHelper、すべての要素を反復処理するために使用する必要があります。

class ToolTipManager
{
    List<ToolTipContainer> source;

    public ToolTipManager(List<ToolTipContainer> source)
    {
        this.source = source;
    }

    public void EnumVisual(Visual myVisual)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++)
        {                
            Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i);                                 
            ((dynamic)childVisual).ToolTip = source.Where(x => x.ElementName == childVisual.GetValue(Control.NameProperty) as string).Select(x => x.ToolTip).FirstOrDefault();                                
            EnumVisual(childVisual);
        }
    }
}

使用例:

<Window x:Class="WPFToolTipDB.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <Button Name="Button" Content="Click me" />
            <TextBox MinWidth="150" />
            <Button Name="Button1" Content="Click me!" />
            <TextBlock Name="TextBlock" Text="My text block" />
            <StackPanel Orientation="Horizontal">
                <TextBlock Name="tbName" Text="Name:" />
                <TextBox Name="tbEnterName" MinWidth="150" />
            </StackPanel>
        </StackPanel>
    </Grid>
</Window>

分離コード:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // When you don't specify name of the element you can set default ToolTip.
        source.Add(new ToolTipContainer { ElementName = string.Empty, ToolTip = "Empty ToolTip!!!" });
        source.Add(new ToolTipContainer { ElementName = "Button", ToolTip = "Click me" });
        source.Add(new ToolTipContainer { ElementName = "Button1", ToolTip = "Click me!" });
        source.Add(new ToolTipContainer { ElementName = "TextBlock", ToolTip = "My TextBlock" });
        source.Add(new ToolTipContainer { ElementName = "tbName", ToolTip = "Enter your name!" });
        source.Add(new ToolTipContainer { ElementName = "tbEnterName", ToolTip = "Please enter your name here!" });            

        var ttManager = new ToolTipManager(source);
        ttManager.EnumVisual(this.Content as Visual);
    }
    List<ToolTipContainer> source = new List<ToolTipContainer>();
}
于 2013-03-11T17:28:15.667 に答える