.NET 4.0 Breaking Change - Использование расширения разметки в качестве значения свойства Setter в стиле XAML - PullRequest
2 голосов
/ 10 января 2011

В .NET 3.5SP1 у меня был стиль со следующей настройкой свойства.

<Setter Property="ToolTip" Value="{resource:Resource Group=Text, Key=BTN_CLOSE}"/>

Расширение разметки получит доступ к нашим сателлитным сборкам и получит соответствующий текст ресурса для всплывающей подсказки.Причина, по которой это делается таким образом, заключается в том, что наше приложение настраивается.Использование расширения разметки позволяет нашим клиентам использовать комбинацию клавиш, чтобы увидеть ключ для текста, а затем изменить текстовое значение, если они захотят это сделать.

После обновления до .NET 4.0 возникает следующая ошибка, когда определяется вышеупомянутый xaml для определения всплывающей подсказки для моего стиля кнопки.Есть ли другой способ сделать это?

System.Windows.Markup.XamlParseException: A 'Binding' cannot be set on the
'Value' property of type 'Setter'. A 'Binding' can only be set on a
DependencyProperty of a DependencyObject.
at System.Windows.Markup.XamlReader.RewrapException(Exception e, Uri baseUri)
at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter)
at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlObjectWriter objectWriter)
at System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject container, IComponentConnector componentConnector, IStyleConnector styleConnector, List`1 affectedChildren, UncommonField`1 templatedNonFeChildrenField)
at System.Windows.FrameworkTemplate.LoadContent(DependencyObject container, List`1 affectedChildren)
at System.Windows.StyleHelper.ApplyTemplateContent(UncommonField`1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate)
at System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container)
at System.Windows.FrameworkElement.ApplyTemplate()
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Canvas.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV)
at System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV)
at System.Windows.Controls.Grid.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
at System.Windows.Controls.ContentPresenter.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Documents.AdornerDecorator.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Border.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Window.MeasureOverrideHelper(Size constraint)
at System.Windows.Window.MeasureOverride(Size availableSize)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Interop.HwndSource.Process_WM_SIZE(UIElement rootUIElement, IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Interop.HwndSource.LayoutFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

Полагаю, я пропустил ключевой элемент.Чтобы разрешить переключение между текстом и ключами, у нас есть класс ResourceCache, в котором хранятся значения.В предоставленном значении часть, которая нарушает привязку всплывающей подсказки, является фактом, что мы возвращаем связывание. ProvideValue (serviceProvider).Это то же самое, что было в .NET 3.5SP1.

public override object ProvideValue(IServiceProvider serviceProvider)
{
  ResourceCache resourceCache = ResourceCache.Instance;
  resourceCache["cacheKey"] = "hello";

  Binding binding;

  binding = new Binding();
  binding.Source = resourceCache;
  binding.Path = new PropertyPath("[" + "cacheKey" + "]");
  binding.Mode = BindingMode.OneWay;

  return binding.ProvideValue(serviceProvider);
}

1 Ответ

2 голосов
/ 11 января 2011

См. Следующий пост: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/931d7bff-90b6-4a70-bb0b-3a097e1301a1/

Это ошибка в фреймворке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...