2016-12-02 19 views
0

私たちのWPFソフトウェアでは、ControlTemplateを使用して、ウィンドウを縮小/拡大させるToggleButtonを定義しています。 ToggleButtonの定義は以下の通りである:WPF ControlTemplateの子に固有の名前を与える

<ToggleButton ToolTip="Standard/Extended" Grid.Column="0" 
    x:Name="PART_MaximizeToggle" VerticalAlignment="Top" 
    HorizontalAlignment="Right" Margin="0,5,5,0" 
    Width="14" Height="14" Cursor="Hand"> 

私たちは、右上には、このボタンを含むカスタムDockPanelを作成しています。我々のアプリケーションは、同時にこのDockPanel Sの最大3つを含むことができる:

DockPanel screenshots

DockPanelの右側の小さな矩形が上記画像に示されています。

3つの矩形のすべてが同じ名前("PART_MaximizeToggle")であることに注意してください。これは、CodedUIプログラムを記述してテストを自動化する際に問題を引き起こします。 CodedUIはFriendlyNamesのすべてを"PART_MaximizeToggle"という名前のフィールドを空にしてキャプチャします。 DockPanelの位置と順序は、ユーザーが望むものに基づいて変更することができます。

CodedUIのキャプチャをクリックが期待されるボタンと正確に一致させるにはどうすればよいですか?私はそれぞれのトグルボタンのNameを動的にすることを考えていましたが、特定のDockPanelに固定しました。

どうすればいいですか?より良いアプローチがありますか?

答えて

1

AttachedPropertyで名前を自動的に割り当てることができます(and register)。各プレフィックスのカウンタを増やします。

<!-- will be Button_0 --> 
<Button namespace:TestingProperties.AutoName="Button"/> 

<!-- will be Button_1 --> 
<Button namespace:TestingProperties.AutoName="Button"/> 

<!-- will be Button_2 --> 
<Button namespace:TestingProperties.AutoName="Button"/> 

結果のビジュアルツリー:

VisualTree of Example

は、XAMLで

public static class TestingProperties 
{ 
    private static readonly Dictionary<string, int> _counter = new Dictionary<string, int>(); 

    public static readonly DependencyProperty AutoNameProperty = DependencyProperty.RegisterAttached(
     "AutoName", typeof(string), typeof(TestingProperties), new PropertyMetadata(default(string), OnAutoNamePropertyChanged)); 

    private static void OnAutoNamePropertyChanged(DependencyObject element, DependencyPropertyChangedEventArgs eventArgs) 
    { 
     string value = (string) eventArgs.NewValue; 

     if (String.IsNullOrWhiteSpace(value)) return; 
     if (DesignerProperties.GetIsInDesignMode(element)) return; 
     if (!(element is FrameworkElement)) return; 

     int index = 0; 
     if (!_counter.ContainsKey(value)) 
      _counter.Add(value, index); 
     else 
      index = ++_counter[value]; 

     string name = String.Format("{0}_{1}", value, index); 
     ((FrameworkElement)element).Name = name; 
     ((FrameworkElement)element).RegisterName(name, element); 
    } 

    public static void SetAutoName(DependencyObject element, string value) 
    { 
     element.SetValue(AutoNameProperty, value); 
    } 

    public static string GetAutoName(DependencyObject element) 
    { 
     return (string)element.GetValue(AutoNameProperty); 
    } 
} 

使用法(これは概念だけの証拠である、あなたも名が有効であることを確認する必要があります)

1

Manfred Radlwimmerのソリューションは便利ですが、コントロールを難しくしています。

コントロールのOnApplyTemplate内で、そのテンプレート部分を検索する動的コードはすべて苦労します。

代わりに、オートメーションIDに同じトリック(一意のIDの生成)を使用し、テストでオートメーションIDを使用することもできます。

参照: http://www.jonathanantoine.com/2011/11/03/coded-ui-tests-automationid-or-how-to-find-the-chose-one-control/

関連する問題