gpt4 book ai didi

c# - 从 .NET 3.5 到 4 似乎打破了旧版 XAML

转载 作者:行者123 更新时间:2023-11-30 12:14:27 26 4
gpt4 key购买 nike

在我排除故障的遗留组件中,我偶然发现了以下内容:

<CustomControls:DiscreteSlider x:Name="slider" Grid.Column="1">
<CustomControls:DiscreteSlider.Value>
<MultiBinding Mode="TwoWay">
<MultiBinding.Converter>
<WinConverters:FeatureConverter />
</MultiBinding.Converter>
<Binding Path="Enabled" />
<Binding Path="Value" />
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:DialogBase}}" />
</MultiBinding>

这是一个类似 slider 的用户控件(“DiscreteSlider”)的绑定(bind),它在代码后面有以下代码(控件实际上包装了一个 slider 并对其执行操作):

public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register(
"Value",
typeof(double),
typeof(DiscreteSlider),
new FrameworkPropertyMetadata((double)0.0,
FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(OnValueChanged)));

public double Value
{
get { return (double)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}

private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DiscreteSlider obj = d as DiscreteSlider;
if (obj != null)
{
double oldValue = (double)e.OldValue;
double newValue = (double)e.NewValue;
obj._Slider.Value = newValue;
obj.DoValueChanged(oldValue, newValue);
}
}

private void Thumb_DragCompleted(object sender, DragCompletedEventArgs e)
{
_IsUserChange = true;
Value = _Slider.Value;
}

发生的事情是该值实际上并未更新。 _Slider.Value设置正确,但赋值后,Value没有变化。

此代码的唯一变化是我们从 .NET 3.5 升级到 4.0。我能够通过从 XAML 中的多重绑定(bind)中删除 Mode="TwoWay" 来“修复”这个问题。但是,我不能忍受巧合编程。我想知道为什么会这样。

有没有人知道为什么这个 XAML 和代码在 3.5 而不是 4 中起作用的解释?如果您能想到一些其他可能的解释,我很乐意听到它,但是自从它在 3.5 中部署(和功能)以来,该控件的 XAML 和背后的代码都没有改变。

编辑:

这是相关值转换器的代码:

public class FeatureConverter : IMultiValueConverter
{
private bool Enabled = true;
private const int MinValue = MelodyConst.MinValue;

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values == null || values.Count() < 2) return null;

double returnValue = MelodyConst.DisabledValue;

bool featureEnabled;
Int32 featureValue;

bool.TryParse(values[0].ToString(), out featureEnabled);
Int32.TryParse(values[1].ToString(), out featureValue);

Enabled = featureEnabled;

if (!featureEnabled)
return returnValue;
else
returnValue = (double)(featureValue);

return returnValue;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
Int32 newSliderValue;
Int32.TryParse(value.ToString(), out newSliderValue);

object[] lsValues = new object[2];
lsValues[0] = (object)Enabled;
lsValues[1] = newSliderValue;

return lsValues;
}
}

最佳答案

我没有亲身经历过你遇到的问题。但是根据ScottGu's blog Xaml/Baml 解析器已被 WPF 4.0 中的新解析器取代。所以 3.5 和 4.0 之间完全有可能有一些重大变化,尽管我没有找到任何关于你的问题的具体引用。

来自上面的博客。

WPF 4 has replaced its implementation of XamlReader.Load(), BAML loading, Control & DataTemplates functionality with a new engine built on top of the new System.Xaml.dll. As part of this effort, we’ve fixed many bugs and made many functionality improvements.

关于c# - 从 .NET 3.5 到 4 似乎打破了旧版 XAML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9319882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com