0

WPF アプリケーションでカスタム コントロールを使用しています。このカスタム コントロールには、ロジックとリソース ディクショナリが含まれています。私のアプリケーションには、ログイン ウィンドウとメイン ウィンドウがあります。アプリケーションが最初にログイン ウィンドウをロードする

<Application x:Class="Dest.App"
             ....
             StartupUri="Login.xaml">
</Application>

メイン ウィンドウで使用するカスタム コントロール

<time:Calendar CloseAppointment="OnDeleteAppointment" AddAppointment="OnAddAppointment" Appointments="{Binding Path=Model}" />

また、MainWindow では、アセンブリからリソース ディクショナリをロードします

<ResourceDictionary>
  <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/WpfCalendar;component/Dictionary.xaml"/>
  </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Visual Studio は例外なくカスタム コントロールを読み込みます。しかし、アプリケーションをロードしてログインに成功すると、ログインビューのビューモデルがメインウィンドウを呼び出します

 MainWindow mainWindow = new MainWindow();
 mainWindow.Show();

メインウィンドウのコンストラクター

public MainWindow()
{
   InitializeComponent();    
   m_MainViewModel = new MainViewModel();
   this.DataContext = m_MainViewModel;
}

私は例外を受け取ります

例外

例外の詳細

D:\development\Dental Soft\LotusScheduler\WpfScheduler\WpfCalendar\Logic\Calendar.cs:line 122 の WpfCalendar.Logic.Calendar.FilterAppointments() で、D:\development の WpfCalendar.Logic.Calendar.OnAppointmentsChanged(DependencyPropertyChangedEventArgs e) で\Dental Soft\LotusScheduler\WpfScheduler\WpfCalendar\Logic\Calendar.cs: D:\development\Dental Soft\LotusScheduler\WpfScheduler\WpfCalendar\Logic\ の WpfCalendar.Logic.Calendar.OnAppointmentsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) の 109 行目Calendar.cs: System.Windows.DependencyObject の System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) の 100 行目 System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) の System.Windows.DependencyObject.System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex、DependencyProperty dp、PropertyMetadata メタデータ、EffectiveValueEntry oldEntry、EffectiveValueEntry& newEntry、Boolean coerceWithDeferredReference、Boolean coerceWithCurrentValue、OperationType operationType) での NotifyPropertyChange (DependencyPropertyChangedEventArgs args) System.Windows.DependencyObject.InvalidateProperty (DependencyProperty dp、 Boolean preserveCurrentValue) で System.Windows.Data.BindingExpressionBase.Invalidate(Boolean isASubPropertyChange) で System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange) で System.Windows.Data.BindingExpression.Activate(Object item) で System. .Windows.Data.BindingExpression.AttachToContext (AttachAttempt 試行) System.Windows.Data で。BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(Boolean lastChance) at MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance) at MS.Internal.Data.DataBindEngine.Run(Object arg) at MS.Internal. Data.DataBindEngine.OnLayoutUpdated (オブジェクト センダー、EventArgs e) System.Windows.ContextLayoutManager.fireLayoutUpdateEvent() で System.Windows.ContextLayoutManager.UpdateLayout() で System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg) で System.Windows.Media .MediaContext.InvokeOnRenderCallback.DoWork() で System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks() で System.Windows.Media.MediaContext.RenderMessageHandlerCore (Object resizedCompositionTarget) で System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget) で System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget) で.Windows.Media.System.Windows.Interop.HwndTarget.OnResize() の MediaContext.Resize(ICompositionTarget resizedCompositionTarget) MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&handled) at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o ) 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) at System. Windows.Threading.Dispatcher。MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) の LegacyInvokeImpl(DispatcherPriority 優先度、TimeSpan タイムアウト、デリゲート メソッド、オブジェクト引数、Int32 numArgs) MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, MS.Win32.HwndSubclass.DefWndProcWrapper(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) の MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg) 、IntPtr wParam、IntPtr lParam) MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd、Int32 msg、IntPtr wParam、IntPtr lParam) MS.Win32.UnsafeNativeMethods.SetWindowPos(HandleRef hWnd、HandleRef hWndInsertAfter、Int32 x、Int32 y、Int32 cx、Int32 cy、Int32 フラグ) System.Windows.Window.SetupInitialState (Double requestedTop、Double requestedLeft、Double requestedWidth、Double requestedHeight) で System.Windows.Window.CreateSourceWindow(Boolean duringShow) で System.Windows.Window.CreateSourceWindowDuringShow() で System.Windows.Window.SafeCreateWindowDuringShow() で System.Windows.Window.ShowHelper( System.Windows.Window.Show() at ViewModel.LoginingViewModel.Login(Object parameter) D:\development\Dental Soft\Lotus\AMS\Dentist\ViewModel\LoginingViewModel.cs:line 162 at ViewModel.LoginingViewModel D:\development\Dental Soft\Lotus\AMS\Dentist\ViewModel\LoginingViewModel.cs:D:\development\Dental Soft\Lotus\ の ViewModel.CommonCommand.Execute(Object parameter) の 115 行目の .b__0(Object param) AMS\Dentist\Commands\CommonCommand.cs: MS.Internal.Commands.CommandHelpers の 59 行目。CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated) System.Windows.Controls.Primitives.ButtonBase.OnClick() で System.Windows.Controls.Button.OnClick() で System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e) System.Windows.UIElement.OnMouseLeftButtonUpThunk (オブジェクト送信者、MouseButtonEventArgs e) で System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (デリゲート genericHandler、オブジェクト genericTarget) で System.Windows.RoutedEventArgs.InvokeHandler (デリゲート ハンドラー、オブジェクト ターゲット) で System. System.Windows.UIElement の System.Windows.EventRoute.InvokeHandlersImpl (オブジェクト ソース、RoutedEventArgs args、Boolean reRaised) の Windows.RoutedEventHandlerInfo.InvokeHandler (オブジェクト ターゲット、RoutedEventArgs routedEventArgs)。System.Windows.UIElement.OnMouseUpThunk (オブジェクト送信者、MouseButtonEventArgs e) の ReRaiseEventAs (DependencyObject 送信者、RoutedEventArgs args、RoutedEvent newEvent) System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (デリゲート genericHandler、オブジェクト genericTarget) で System.Windows.RoutedEventArgs。 System.Windows.RoutedEventHandlerInfo.InvokeHandler(オブジェクト ターゲット、RoutedEventArgs routedEventArgs) の InvokeHandler (デリゲート ハンドラー、オブジェクト ターゲット) System.Windows.EventRoute.InvokeHandlersImpl (オブジェクト ソース、RoutedEventArgs args、Boolean reRaised) で System.Windows.UIElement.RaiseEventImpl( System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args) の DependencyObject 送信者、RoutedEventArgs args) System.Windows.UIElement.RaiseEvent(RoutedEventArgs args、Boolean trusted) の System.Windows.Input。System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd、InputMode モード、 Int32 タイムスタンプ、RawMouseActions アクション、Int32 x、Int32 y、Int32 wheel) の System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean&handled) at System.Windows.Interop.HwndSource. MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&handled) at MS.Win32.HwndSubclass.DispatcherCallback(オブジェクト o) System.Windows.Threading で。MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (オブジェクト ソース、デリゲート メソッド、オブジェクト引数、Int32 numArgs、デリゲート catchHandler) での ExceptionWrapper.InternalRealCall (デリゲート コールバック、オブジェクト引数、Int32 numArgs) System.Windows.Threading.Dispatcher.LegacyInvokeImpl( DispatcherPriority 優先度、TimeSpan タイムアウト、デリゲート メソッド、オブジェクト引数、Int32 numArgs) (MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd、Int32 msg、IntPtr wParam、IntPtr lParam) で)、MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) (システムで) .Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame フレーム) で System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame フレーム) で System.Windows.Threading.Dispatcher.Run() で System.Windows.Application.RunDispatcher(オブジェクトは無視) System.Windows.Application で。D:\development\Dental Soft\Lotus\AMS\Dentist\ の Dentist.App.Main() で System.Windows.Application.Run() で System.Windows.Application.Run(ウィンドウ ウィンドウ) で RunInternal(ウィンドウ ウィンドウ) Microsoft. VisualStudio.HostingProcess.HostProc.RunUsersAssembly() System.Threading.ThreadHelper.ThreadStart_Context(オブジェクト状態) System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback コールバック、オブジェクト状態、Boolean preserveSyncCtx) で System.Threading.ExecutionContext.Run (ExecutionContext executionContext、ContextCallback コールバック、オブジェクトの状態、ブール値の preserveSyncCtx)System.Threading.ThreadHelper.ThreadStart() での Threading.ExecutionContext.Run (ExecutionContext 実行コンテキスト、ContextCallback コールバック、オブジェクト状態)

問題管理機能を備えたリソース ディクショナリの一部

<Border BorderBrush="#A5BFE1" BorderThickness="0,1,1,1" Background="White" Grid.Column="1" Grid.Row="0" >
    <TextBlock x:Name="DayHeader" HorizontalAlignment="Center" VerticalAlignment="Center">
    <TextBlock.ToolTip>
        <ToolTip>
            <StackPanel>
                <TextBlock FontWeight="Bold" Text="{x:Static Properties:Resources.CalendarSelectedDayTitle}" />
                <TextBlock Text="{x:Static Properties:Resources.CalendarSelectedDayDescription}" />
            </StackPanel>
        </ToolTip>
    </TextBlock.ToolTip>
        </TextBlock>
</Border>
<time:Scroll x:Name="scrollViewer" CustomVerticalOffset="640.0" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="60" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <time:TimeRibbon Grid.Column="0"></time:TimeRibbon>
        <time:SchedulerDay Grid.Column="1" x:Name="Day"></time:SchedulerDay>
    </Grid>
</time:Scroll>

(例外をスローする) Calendar コントロールのコンストラクター

public Calendar()
{
    DefaultStyleKeyProperty.OverrideMetadata(typeof(Calendar), new FrameworkPropertyMetadata(typeof(Calendar)));

    CommandManager.RegisterClassCommandBinding(typeof(Calendar), 
        new CommandBinding(NextDay, new ExecutedRoutedEventHandler(OnExecutedNextDay), 
            new CanExecuteRoutedEventHandler(OnCanExecuteNextDay)));

    CommandManager.RegisterClassCommandBinding(typeof(Calendar),
        new CommandBinding(PreviousDay, new ExecutedRoutedEventHandler(OnExecutedPreviousDay),
            new CanExecuteRoutedEventHandler(OnCanExecutePreviousDay)));
}

しかし、app.xaml で最初のウィンドウ MainWindow を設定すると、LoginWindow ではなく、すべてが正常に動作し、例外はありません。

問題の原因を教えてください。

ありがとうございました

4

1 に答える 1

3

FilterAppointments クラス コンストラクターで (スクリーンショットのように) 例外が発生しています。コントロールテンプレートに基づいていくつかのアクションを実行していますが、その時点ではテンプレートはまだ割り当てられていません。OnApplyTemplate() をオーバーライドして、代わりにそのコードをそこに移動する必要があります。

于 2012-10-31T20:32:46.443 に答える