Uwp 更新ContentControl时如何避免闪烁?

Uwp 更新ContentControl时如何避免闪烁?,uwp,Uwp,我有一个DataTemplate定义如下 <DataTemplate x:Key="singleUnit"> <RelativePanel > <Button Padding="0,0,0,0" BorderThickness="0" Background="Transparent" Width="180" Height="210" Margin="0,0,70,20"

我有一个
DataTemplate
定义如下

        <DataTemplate x:Key="singleUnit">
            <RelativePanel >
                <Button Padding="0,0,0,0" BorderThickness="0" Background="Transparent" Width="180" Height="210" Margin="0,0,70,20"
                        Style="{StaticResource textButtonStyle1}"
                        Command="{Binding ClickCommand}" CommandParameter="{Binding itemIndex}">
                    <StackPanel Orientation="Vertical">
                        <Image Source="{Binding icon_url, Converter={StaticResource _path2Image}}" Width="150" Height="150" Stretch="Uniform" Margin="0,0,0,0"/>
                        <Image Source="ms-appx:///Assets/SettingPage/Selected.png" Width="30" Height="30" Margin="130,-250,0,0"
                               Opacity="{Binding isSelected, Converter={StaticResource _selectedToOpacity}}"/>                           
                    </StackPanel>
                </Button>
            </RelativePanel>
        </DataTemplate>
DataModel:变量dms是包含实例ifDataModel

    public class DataModel
    {
        public string icon_url { get; set; }
        public int itemIndex { get; set; }
        public bool isSelected { get; set; }
        public ICommand ClickCommand { get; set; }
    }

    DataModel[] dms;
例如,总共有6幅图像。我点击其中两个,分别是A和B。 当我点击A时,会显示A的图标(小勾号图标)(同时A的图像会一直显示);同时隐藏B的图标(同时保持显示B的图像)。反之亦然

问题: 在这里,当B的图标隐藏时(意味着我单击了项目A),有时B的图像会闪烁一次。不总是这样。为什么以及如何解决

更多信息: 我制作了一个演示项目来展示这个问题,请检查此链接以获取代码:


Richard提到使用INotifyPropertyChanged,但我不知道如何将其与DataTemplate结合起来。

我分析了您的代码,找到了闪烁的原因

主要原因是您重新创建了
ContentControl
,并用新控件替换了旧控件,这是不必要的

请试试这个:

  • 数据模型
    实现
    INotifyPropertyChanged
    接口:
  • 公共类数据模型:INotifyPropertyChanged
    {
    公共字符串图标\u url{get;set;}
    公共bool ssml_支持{get;set;}
    公共字符串数据_name{get;set;}
    公共字符串数据类型{get;set;}
    公共int itemIndex{get;set;}
    私立学校当选;
    公选学校
    {
    get=>\u被选中;
    设置
    {
    _isSelected=值;
    OnPropertyChanged();
    }
    }
    公共ICommand ClickCommand{get;set;}
    公共事件属性更改事件处理程序属性更改;
    公共void OnPropertyChanged([CallerMemberName]字符串propertyName=”“)
    {
    PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
    }
    }
    
  • 重写
    SetMarker
    方法:
  • private void SetMarker(int索引)
    {
    ContentControl ccUnit=wrapGrid.Children[previousSelectedIndex]作为ContentControl;
    var previousContent=ccUnit.Content作为数据模型;
    previousContent.isSelected=false;
    ContentControl currentUnit=wrapGrid.Children[index]作为ContentControl;
    var currentContent=currentUnit.Content作为数据模型;
    currentContent.isSelected=true;
    先前选择的索引=索引;
    }
    

    这样,我们不需要创建新控件,只需要修改旧控件的状态。这不会导致所谓的
    闪烁
    问题。

    嗨,汤姆,如果你能提供最低限度的可运行演示,这将帮助我们更直观地再现你的问题。此外,图像闪烁可能会触发重新渲染。您可以尝试使
    DataModel
    实现
    INotifyPropertyChanged
    接口。更改单个属性时不要重新渲染。@RichardZhang MSFT感谢您的回复!请查看我的主要帖子,我在GitHub中提供代码。我不知道如何对DataTemplate元素使用INotifyPropertyChanged。请告知。
        public class DataModel
        {
            public string icon_url { get; set; }
            public int itemIndex { get; set; }
            public bool isSelected { get; set; }
            public ICommand ClickCommand { get; set; }
        }
    
        DataModel[] dms;