1

我在 WPF 中为窗口创建了一个样式

<Style x:Key="JIMSWindow" TargetType="Window">
    <Setter Property="ResizeMode" Value="NoResize"/>
    <Setter Property="ShowInTaskbar" Value="False"/>
    <Setter Property="SizeToContent" Value="WidthAndHeight"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="WindowStyle" Value="None"/>
    <Setter Property="BorderThickness" Value="0"/>        
    <Setter Property="AllowsTransparency" Value="True"/>                
    <Setter Property="loc:CloseWindow.EscapeClosesWindow" Value="True"></Setter>
</Style>

EscapeCloseWindow课程就是这样。

public static class CloseWindow 
    {
        public static readonly DependencyProperty EscapeClosesWindowProperty = DependencyProperty.RegisterAttached(
           "EscapeClosesWindow",
           typeof(bool),
           typeof(CloseWindow ),
           new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnEscapeClosesWindowChanged)));

        public static bool GetEscapeClosesWindow(DependencyObject d)
        {
            return (bool)d.GetValue(EscapeClosesWindowProperty);
        }    
        public static void SetEscapeClosesWindow(DependencyObject d, bool value)
        {
            d.SetValue(EscapeClosesWindowProperty, value);
        }    
        private static void OnEscapeClosesWindowChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            Window target = (Window)d;
            if (target != null)
            {
                target.PreviewKeyDown += new System.Windows.Input.KeyEventHandler(Window_PreviewKeyDown);
            }
        }    
        private static void Window_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            Window target = (Window)sender;  
            // If this is the escape key, close the window
            if (e.Key == Key.Escape)
                target.Close();
        }
    }

现在,当我View在 WPF MVVM 中打开我的时候,我会遇到一个异常,例如

Unable to cast object of type 'Microsoft.Expression.Platform.WPF.InstanceBuilders.WindowInstance' to type 'System.Windows.Window'.
   at JIMS.Commands.CloseWindow.OnEscapeClosesWindowChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) in C:\Documents and Settings\323582\Desktop\JIMS\JIMS.Commands\CloseWindow.cs:line 84
   at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.StyleHelper.ApplyStyleOrTemplateValue(FrameworkObject fo, DependencyProperty dp)
   at System.Windows.StyleHelper.InvalidateContainerDependents(DependencyObject container, FrugalStructList`1& exclusionContainerDependents, FrugalStructList`1& oldContainerDependents, FrugalStructList`1& newContainerDependents)
   at System.Windows.StyleHelper.DoStyleInvalidations(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style newStyle)
   at System.Windows.StyleHelper.UpdateStyleCache(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style newStyle, Style& styleCache)
   at System.Windows.FrameworkElement.OnStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
   at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
   at Microsoft.Expression.Platform.WPF.WpfDependencyPropertyImplementation.SetValue(Object target, Object valueToSet)
   at Microsoft.Expression.DesignModel.Metadata.DependencyPropertyReferenceStep.SetValue(Object target, Object valueToSet)
   at Microsoft.Expression.DesignModel.Core.InstanceBuilderOperations.SetValue(Object target, IProperty propertyKey, Object value)
   at Microsoft.Expression.DesignModel.InstanceBuilders.ClrObjectInstanceBuilder.ModifyValue(IInstanceBuilderContext context, ViewNode target, IProperty propertyKey, Object value, PropertyModification modification)
   at Microsoft.Expression.DesignModel.InstanceBuilders.DependencyObjectInstanceBuilderBase`1.ModifyValue(IInstanceBuilderContext context, ViewNode target, IProperty propertyKey, Object value, PropertyModification modification)
   at Microsoft.Expression.Platform.WPF.InstanceBuilders.FrameworkElementInstanceBuilder.ModifyValue(IInstanceBuilderContext context, ViewNode target, IProperty propertyKey, Object value, PropertyModification modification)
   at Microsoft.Expression.Platform.WPF.InstanceBuilders.WindowInstanceBuilder.ModifyValue(IInstanceBuilderContext context, ViewNode target, IProperty propertyKey, Object value, PropertyModification modification)
   at Microsoft.Expression.DesignModel.InstanceBuilders.ClrObjectInstanceBuilder.UpdateProperty(IInstanceBuilderContext context, ViewNode viewNode, IProperty propertyKey, DocumentNode valueNode)

请任何人都可以帮我解决这个问题。

4

3 回答 3

2

你可以尝试改变

 Window target = (Window)d;

Window target = d as Window

在我的机器上,它可以顺利进行。

于 2012-09-22T08:41:19.800 回答
1

Visual Studio中的WPF XAML设计器无法显示任何派生自. 作为一种解决方法,它会拦截这种情况并替换它自己的内部代理类型来充当实时XAML根。该类型称为:System.Windows.Window

Microsoft.VisualStudio.DesignTools.WpfDesigner.InstanceBuilders.WindowInstance

它可以在 assembly 中找到"Microsoft.VisualStudio.DesignTools.WpfDesigner, Version=15.0.0.0",我在以下位置找到:

"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\PrivateAssemblies \Microsoft.VisualStudio.DesignTools.WpfDesigner.dll"


无论如何,我对这场可悲惨败的贡献如下:

→ 两者System.Windows.Window和 XAML 设计器的WindowInstance代理类共享相同的直接基类,即System.Windows.Controls.ContentControl. ←</p>

这意味着通过降低TargetType您(例如)控件上指定的类型,Template如下所示,它将适用于任何一种类型。当然,您将失去 的特定功能Window,但至少这为您提供了进一步解决方法的稳定起点。

<ControlTemplate x:Key="any_key_name" TargetType="{x:Type ContentControl}">
    <Border Background="Green">
        <ContentPresenter />
    </Border>
</ControlTemplate>

与此相关,请注意,可以WindowInstance在运行时以编程方式检测案例,而无需实际加载或引用上面引用的 VS2017 类库,只需IProvideValueTarget.TargetObject使用字符串比较检查相关对象(即,可能来自 )GetType().Name == "WindowInstance":。

无论如何,上面的示例是在XAMLControlTemplate中定义的一个小例子,它确实对和都正确工作,并且没有普遍的崩溃,不幸的是,经常有损于XAML设计器的主要有用好处。System.Windows.WindowMicrosoft.VisualStudio...WindowInstance

于 2019-12-12T03:59:21.990 回答
0

您可以添加对Radical Framework的引用并更改 Dependecy 属性的定义:

        public static readonly DependencyProperty ShowIconProperty = DependencyProperty.RegisterAttached(
                            "ShowIcon",
                            typeof(bool),
                            typeof(WindowsManager),
                            new FrameworkPropertyMetadata(true, new PropertyChangedCallback((d, e) =>
                                {
                                    if (!DesignTimeHelper.GetIsInDesignMode())
                                        RemoveIcon((Window)d);
                                }
                                )));
于 2015-08-11T14:57:36.080 回答