XAML 启用消息文字选取的数据列

k2arahey  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(142)

有没有可能以某种方式设置WinUI 3信息栏消息的IsTextSelectionEnabled="True"属性,而不从source复制整个控件模板?
我尝试过一些setter,或者使用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>
8ulbf1ek

8ulbf1ek1#

如果您不想覆盖Xaml,则需要在代码隐藏中执行此操作。根据信息栏的源代码,我们可以知道消息的TextBlock的名称。它称为Message。因此,我们可以使用VisualTreeHelper从信息栏中获取TextBlock控件并更改其属性。
我在这里做了一个样品,你可以参考一下:

主页面.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;
    }

主页面.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>

结果:

相关问题