从风格中获得风格控制

时间:2016-09-13 20:19:07

标签: c# uwp uwp-xaml

我有一种风格:

<Style TargetType="TextBox" x:Key="TextBoxStyle">
   <Setter Property="Template">
      <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Grid>
                     <Button x:Name="Button1" />
                </Grid>
            <ControlTemplate/>
      </Setter.Value>
   </Setter> 
</Style>

<Style TargetType="local:MyControl">
   <Setter Property="Template">
      <Setter.Value>
            <ControlTemplate TargetType="local:MyControl">
                <Grid>
                     ...
                     <TextBox x:Name="TextBox1" Style="{StaticRessource TextBoxStyle}/>
                     ...
                </Grid>
            <ControlTemplate/>
      </Setter.Value>
   </Setter> 
</Style>

问题是我无法获得“Button1”,代码背后:

public class MyControl : ItemsSource
{

    private TextBox _textBox1;
    private Button _button1;

    protected override void OnApplyTemplate()
    {
        _textBox1 = (TextBox)GetTemplateChild("TextBox1");

        base.OnApplyTemplate();

    }

}

在wpf我能做到:

_button1 = (Button)_textBox1.Template.FindName("Button1");

但是uwp中不存在“FindName()”方法,那么我如何获得Button1?

谢谢!

编辑:

如果我们查看AutoSuggestBox's style,我们就有了样式AutoSuggestBox和AutoSuggestBoxTextBoxStyle。 autosuggestbox引发事件“QuerySubmitted”,该事件来自“QueryButton”按钮,该按钮位于AutoSuggestBoxTextBoxStyle中。那么他可以正确访问该按钮吗?

1 个答案:

答案 0 :(得分:0)

根据您的代码,您创建了一个模板化控件。 GetTemplateChild方法用于从模板中获取子元素。上面的代码快照位于MyControl类中,我们可以像MyControl模板一样获取子元素,就像找到TextBox1一样。但是对于Button1,它不在MyControl的模板中(它位于_textbox1的模板中),似乎我们无法得到它。

  

那我如何才能获得Button1?

我们可以在VisualTreeHelper呈现Button1后获得MyControl。以下是有关在MyControl中创建MainPage然后通过VisualTreeHelper获取Button1元素的演示。

Xaml Code

<local:MyControl x:Name="mycontrol" Height="200" Width="200"></local:MyControl>   
<Button x:Name="getbutton1" Click='getbutton1_Click' Content="Get button1"></Button>

背后的代码

  private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
  {
      if (depObj != null)
      {
          for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
          {
              DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
              if (child != null && child is T)
              {
                  yield return (T)child;
              }

              foreach (T childOfChild in FindVisualChildren<T>(child))
              {
                  yield return childOfChild;
              }
          }
      }
  }

  private void getbutton1_Click(object sender, RoutedEventArgs e)
  {
      Button _button1 = null;
      IEnumerable<Button> buttons = FindVisualChildren<Button>(mycontrol);
      foreach (var _button in buttons)
      {
          if (_button.Name == "Button1")
          {
             _button1 = _button;
          }
      }
      System.Diagnostics.Debug.WriteLine(_button1.Content);
  }
  

所以他可以正确访问该按钮吗?

在这种情况下,请检查样式中的QueryButton,它是否在Grid中,而不是TextBox。您在AutoSuggestBox中看到的“文本框”实际上是一个ContentControl,它与QueryButton位于同一个网格中。所以按钮就可以了。