2012-04-18 17 views
1

我在WPF無法投射型「Microsoft.Expression.Platform.WPF.InstanceBuilders.WindowInstance」的目的是鍵入

創建的樣式爲窗口
<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「System.Windows.Window」班是這樣的。

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) 

請任何一個可以幫我解決這個問題。

+1

如何只檢查發件人是否窗口? – Nikolay 2012-04-18 10:04:54

+0

檢查它是否是Window實例是解決方案的一半。由於此代碼將由設計人員運行,並且'd'變量將是'Microsoft.Expression.WpfPlatform.InstanceBuilders.WindowInstance'的一個實例,因此在運行時會強制導致null值,因此您必須檢查是否演員也返回null。如果它是空的,那麼你可以跳過邏輯,因爲它在視覺工作室設計器中運行,你不希望該邏輯運行。 – Triynko 2014-02-11 17:13:25

+0

我認爲這是值得在這裏添加一個鏈接到這個問題 - http://stackoverflow.com/questions/419596/how-does-the-wpf-button-iscancel-property-work – sarh 2015-02-12 22:25:46

回答

2

你可以嘗試改變

Window target = (Window)d; 

Window target = d as Window 
在我的機器

,它可以順利。

+1

你實際上必須添加一個引用Microsoft.Expression.WpfPlatform.dll,然後測試你的變量'd'是否是Microsoft.Expression.WpfPlatform.InstanceBuilders.WindowInstance或System.Windows.Window的一個實例,因爲它將是一個或另一個,這取決於你的代碼是否由設計人員運行或通常運行。實際上,你不希望邏輯在設計器中實際做任何事情,所以它最好是通過「as Window」投射,如果它爲空則忽略它。 – Triynko 2014-02-11 17:10:10

0

您可以添加一個參考Radical Framework和更改的關係是不屬性的定義:

 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); 
           } 
           ))); 
相關問題