UWP 模板查找和修改控件
UWP Template find and modify control
我有一个 TabView,其 header 和项目使用模板。我在 header 模板中找到了这些元素,但是当我以编程方式更改它们的可见性时,属性仍然保持不变。这是为什么?我该如何解决?
我已经尝试将文本 NameTextBlock 和 NameTextBox 更改为 "hello" "world" 之类的字符串,但它仍然显示原始文本。
private void RenameClick(object sender, RoutedEventArgs e)
{
var flyoutItem = sender as MenuFlyoutItem;
var tab = (TabViewItem)PlaylistTabView.ContainerFromItem(flyoutItem.DataContext);
var header = tab.HeaderTemplate.LoadContent();
RenameHeader(header, true, true);
}
private void RenameHeader(DependencyObject header, bool isEdit, bool selectAll)
{
var NameTextBlock = (TextBlock)VisualTreeHelper.GetChild(header, 1);
NameTextBlock.Visibility = isEdit ? Visibility.Visible : Visibility.Collapsed;
TextBox NameTextBox = (TextBox)VisualTreeHelper.GetChild(header, 2);
NameTextBox.Visibility = isEdit ? Visibility.Collapsed : Visibility.Visible;
if (selectAll) NameTextBox.SelectAll();
}
---更新---
这是我的页眉模板:
<controls:TabView.ItemHeaderTemplate>
<DataTemplate x:DataType="data:Playlist">
<SymbolIcon Symbol="Audio" />
<TextBlock
x:Name="NameTextBlock"
Margin="10,0,5,0"
Text="{x:Bind Name, Mode=OneWay}" />
<TextBox
x:Name="NameTextBox"
Margin="10,0,5,0"
AcceptsReturn="True"
Background="Transparent"
ManipulationCompleted="NameTextBox_ManipulationCompleted"
Text="{x:Bind Name, Mode=TwoWay}"
Visibility="Collapsed" />
</StackPanel>
</DataTemplate>
</controls:TabView.ItemHeaderTemplate>
在这种情况下,我建议使用绑定来解决您的问题。
可以尝试让class继承INotifyPropertyChanged
接口,在属性变化时调用OnPropertyChanged
方法
public class Playlist:INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
然后就可以绑定在HeaderTemplate
.
<controls:TabView.ItemHeaderTemplate>
<DataTemplate x:DataType="data:Playlist">
<TextBlock Text={x:Bind Name, Mode=OneWay} />
</DataTemplate>
</controls:TabView.ItemHeaderTemplate>
同样,如果您需要更改TextBlock
的可见性,有两种方法。
首先是将Visibility
属性添加到播放列表class,创建方法与Name
属性相同。
第二种是根据一定的条件(比如IsEdit
)通过IValueConverter
进行转换。
此致。
我有一个 TabView,其 header 和项目使用模板。我在 header 模板中找到了这些元素,但是当我以编程方式更改它们的可见性时,属性仍然保持不变。这是为什么?我该如何解决?
我已经尝试将文本 NameTextBlock 和 NameTextBox 更改为 "hello" "world" 之类的字符串,但它仍然显示原始文本。
private void RenameClick(object sender, RoutedEventArgs e)
{
var flyoutItem = sender as MenuFlyoutItem;
var tab = (TabViewItem)PlaylistTabView.ContainerFromItem(flyoutItem.DataContext);
var header = tab.HeaderTemplate.LoadContent();
RenameHeader(header, true, true);
}
private void RenameHeader(DependencyObject header, bool isEdit, bool selectAll)
{
var NameTextBlock = (TextBlock)VisualTreeHelper.GetChild(header, 1);
NameTextBlock.Visibility = isEdit ? Visibility.Visible : Visibility.Collapsed;
TextBox NameTextBox = (TextBox)VisualTreeHelper.GetChild(header, 2);
NameTextBox.Visibility = isEdit ? Visibility.Collapsed : Visibility.Visible;
if (selectAll) NameTextBox.SelectAll();
}
---更新---
这是我的页眉模板:
<controls:TabView.ItemHeaderTemplate>
<DataTemplate x:DataType="data:Playlist">
<SymbolIcon Symbol="Audio" />
<TextBlock
x:Name="NameTextBlock"
Margin="10,0,5,0"
Text="{x:Bind Name, Mode=OneWay}" />
<TextBox
x:Name="NameTextBox"
Margin="10,0,5,0"
AcceptsReturn="True"
Background="Transparent"
ManipulationCompleted="NameTextBox_ManipulationCompleted"
Text="{x:Bind Name, Mode=TwoWay}"
Visibility="Collapsed" />
</StackPanel>
</DataTemplate>
</controls:TabView.ItemHeaderTemplate>
在这种情况下,我建议使用绑定来解决您的问题。
可以尝试让class继承INotifyPropertyChanged
接口,在属性变化时调用OnPropertyChanged
方法
public class Playlist:INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
然后就可以绑定在HeaderTemplate
.
<controls:TabView.ItemHeaderTemplate>
<DataTemplate x:DataType="data:Playlist">
<TextBlock Text={x:Bind Name, Mode=OneWay} />
</DataTemplate>
</controls:TabView.ItemHeaderTemplate>
同样,如果您需要更改TextBlock
的可见性,有两种方法。
首先是将Visibility
属性添加到播放列表class,创建方法与Name
属性相同。
第二种是根据一定的条件(比如IsEdit
)通过IValueConverter
进行转换。
此致。