我环顾网络寻找答案,但似乎无法让它发挥作用。这就是我所拥有的:
public class UIValues : INotifyPropertyChanged
{
private double zoomValue = 1;
private static readonly UIValues instance = new UIValues();
public event PropertyChangedEventHandler PropertyChanged;
internal static UIValues Instance { get { return instance; } }
internal double ZoomValue
{
get { return zoomValue; }
set
{
if (this.zoomValue == value)
return;
this.zoomValue = value;
this.OnPropertyChanged(new PropertyChangedEventArgs("ZoomValue"));
}
}
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, e);
}
}
然后我有了这个:
<UserControl>
<UserControl.DataContext>
<local:UIValues x:Name="uiValues"/>
</UserControl.DataContext>
.
.
.
<Viewbox x:Name="vbViewBox" RenderTransformOrigin="0.5,0.5">
<local:ImageControl x:Name="imgControl" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Viewbox.RenderTransform>
<TransformGroup>
<CompositeTransform x:Name="trCompositeTransform" ScaleX="{Binding ZoomValue}" ScaleY="{Binding ZoomValue}" Rotation="0" SkewX="0" SkewY="0"/>
</TransformGroup>
</Viewbox.RenderTransform>
</Viewbox>
</UserControl>
所以基本上,每当我从代码隐藏中更改UIValues类的ZoomValue时,UI都不会更新。
任何人都知道为什么?
谢谢!
答案 0 :(得分:2)
查看发布的代码,我猜你有类似的东西来改变缩放值。
UIValues.Instance.ZoomValue = x;
问题是这个xaml: -
<local:UIValues x:Name="uiValues"/>
构造一个独立的UIValues实例,它与静态Instance
属性返回的实例不同。因此,您将更改没有任何内容正在侦听的对象的值。
修改强>
ZoomLevel也是internal
,因为绑定工作必须是公开的。
解决方案是使用IApplicationService
并通过App.xaml执行操作。
将课程改为:
public class UIValues : INotifyPropertyChanged, IApplicationService
{
private double zoomValue = 1;
public event PropertyChangedEventHandler PropertyChanged;
internal static UIValues Instance { get; private set; }
public double ZoomValue
{
get { return zoomValue; }
set
{
if (zoomValue == value)
return;
zoomValue = value;
this.OnPropertyChanged(new PropertyChangedEventArgs("ZoomValue"));
}
}
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, e);
}
void IApplicationService.StartService(ApplicationServiceContext context)
{
Instance = this;
Application.Current.Resources.Add("UIValues", Instance);
}
void IApplicationService.StopService() { }
}
将UIValues
的实例添加到App.Xaml: -
<Application.ApplicationLifetimeObjects>
<local:UIValues />
</Application.ApplicationLifetimeObjects>
然后像这样设置用户控件DataContext
: -
<UserControl ... DataContext="{StaticResource UIValues}">
这就是浪费你可能需要绑定到实际数据的DataContext
。您可以直接在绑定上指定Source
: -
<CompositeTransform ScaleX="{Binding ZoomValue, Source={StaticResource UIValues}}" ScaleY="{Binding ZoomValue, Source={StaticResource UIValues}}" Rotation="0" SkewX="0" SkewY="0"/>
答案 1 :(得分:0)
将ZoomValue
属性的访问修饰符更改为public,一切正常。