我有一种风格:
<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中。那么他可以正确访问该按钮吗?
答案 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
位于同一个网格中。所以按钮就可以了。