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;