Можно ли как-то установить свойство IsTextSelectionEnabled = "True" сообщения WinUI 3 InfoBar, не копируя весь шаблон элемента управления из источника?
Я безуспешно пробовал некоторые установщики или использовал ContentTemplate для добавления пользовательского TextBlock, но это приводит к тому, что кнопка действия оказывается над сообщением, чего я не хочу.
<InfoBar x:Name = "errorBar" Severity = "Error" IsOpen = "False" VerticalAlignment = "Bottom"
Margin = "50" Loaded = "ErrorBar_Loaded">
<InfoBar.ContentTemplate>
<DataTemplate x:DataType = "x:String">
<TextBlock x:Name = "Message"
Text = "{x:Bind}"
IsTextSelectionEnabled = "True"/>
</DataTemplate>
</InfoBar.ContentTemplate>
<InfoBar.ActionButton>
<Button Content = "Action" Click = "InfoBarButton_Click" />
</InfoBar.ActionButton>
</InfoBar>
Мой ответ работает для вас?
Спасибо вам обоим за советы, VisualTreeHelper был тем, на что мне нужно было ориентироваться.





Если вы не хотите переопределять Xaml, вам нужно будет сделать это в отделенном коде. Основываясь на исходном коде InfoBar , мы могли бы узнать имя TextBlock для сообщения. Называется Message. Таким образом, мы могли бы использовать VisualTreeHelper, чтобы получить элемент управления TextBlock из InfoBar и изменить его свойство.
Я сделал образец здесь, и вы можете сослаться на него:
MainPage.Cs:
private void myButton_Click(object sender, RoutedEventArgs e)
{
myButton.Content = "Clicked";
UpdateAvailableNotification.IsOpen = !UpdateAvailableNotification.IsOpen;
TextBlock textBlock = TryFindChildByName(UpdateAvailableNotification, "Message") as TextBlock;
textBlock.IsTextSelectionEnabled = true;
}
public static DependencyObject TryFindChildByName(DependencyObject parant, string ControlName)
{
int count = VisualTreeHelper.GetChildrenCount(parant);
for (int i = 0; i < count; i++)
{
var MyChild = VisualTreeHelper.GetChild(parant, i);
if (MyChild is FrameworkElement && ((FrameworkElement)MyChild).Name == ControlName)
return MyChild;
var FindResult = TryFindChildByName(MyChild, ControlName);
if (FindResult != null)
return FindResult;
}
return null;
}
MainPage.Xaml:
<StackPanel Orientation = "Horizontal" HorizontalAlignment = "Center" VerticalAlignment = "Center">
<InfoBar x:Name = "UpdateAvailableNotification"
Title = "Update available."
Message = "Restart the application to apply the latest update.">
</InfoBar>
<Button x:Name = "myButton" Click = "myButton_Click">Click Me</Button>
</StackPanel>
Результат:
Если вы не хотите приносить весь шаблон, вы можете использовать VisualTreeHelper для доступа к сообщению
TextBlock. Это может помочь.