Home > C# > Toolkit > DockingWindow > AvalonDock > ドキュメント

結合問題に解決策を追加する

原文

Add solution to resolve binding problems(外部サイト)

訳文

結合問題に解決策を追加する

Add solution to resolve binding problems

解説

Hellow!英語がへたくそで、ごめんなさい。

私は、自分のプロジェクトでAvalonDock 1.3を使用し、すべて結合を保存し、いくつかのフォーカスの問題を解決する、簡単な方法を見つけました。!!!

フレームワーク4.0かそれ以降を使用してください。

  1. DockingManagerとFloatingWindowクラスの2つのメソッドを追加します。
  2. 
        internal void AddLogicalChild(FrameworkElement frameworkElement)
        {
            base.AddLogicalChild(frameworkElement);
        }
    
        internal void RemoveLogicalChild(FrameworkElement frameworkElement)
        {
            base.RemoveLogicalChild(frameworkElement);
        }
    
  3. DockingManagerClassの、1つのメソッドを変更します。
  4. 
    private bool flag;
    
    protected virtual void OnActiveContentChanged(DependencyPropertyChangedEventArgs e)
        {
            var cntActivated = e.NewValue as ManagedContent;
            var cntDeactivated = e.OldValue as ManagedContent;
    
            if (cntActivated != null)
            {
                cntActivated.SetIsActiveContent(true);
            }
    
            if (cntActivated != null && cntActivated.ContainerPane is DocumentPane)
            {
                ActiveDocument = cntActivated;
            }
    
            var activeContent = cntActivated;
            if (activeContent == null)
            {
                return;
            }
    
    //------------------------------------------------------------------------------------
    
    var isFloating = VisualTreeHelper.GetParent(activeContent) == null;
    
    if (isFloating)
            {
                flag = true;
    
                var pane = (Pane)LogicalTreeHelper.GetParent(activeContent);
                var window = LogicalTreeHelper.GetParent(pane);
                var floatingWindow = window as FloatingWindow;
                if (floatingWindow != null)
                {
                    floatingWindow.RemoveLogicalChild(pane);
                    var exclusiveCommandBindings =
                        ParentWindow.CommandBindings.Cast().Where(cb => !activeContent.CommandBindings.Contains(cb)).ToList();
                    activeContent.CommandBindings.AddRange(exclusiveCommandBindings);
                    AddLogicalChild(pane);
                }
            }
            else
            {
                flag = false;
                Win32Helper.SendMessage(hwndSource.Handle, 134, 1, 0);
            }       
    
    //------------------------------------------------------------------------------------
    
            //for backward compatibility
            NotifyPropertyChanged("ActiveContent");
    
            if (ActiveContentChanged != null)
            {
                ActiveContentChanged(this, EventArgs.Empty);
            }
        }
    
    
  5. いいね!次に、私たちは、いくつかのフォーカスの問題を解決します。この記事は、私の役に立ちます。
  6. 親ウィンドウのコンストラクタで、この静的プロパティを設定します。

    
            // HwndSource.DefaultAcquireHwndFocusInMenuMode = false;
            Keyboard.DefaultRestoreFocusMode = RestoreFocusMode.None;
    

    続いて、あなたが、ParentWindowで使用する、すべてのメニューとツールバーに、このイベントハンドラを追加します。

    
    private PresentationSource _menuSite;
    
        private void PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
        {
            _menuSite = PresentationSource.FromVisual(this);
            if (_menuSite != null)
            {
                InputManager.Current.PushMenuMode(_menuSite);
                e.Handled = true;
            }
        }
    
        private void LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
        {
            if (_menuSite != null)
            {
                InputManager.Current.PopMenuMode(_menuSite);     
                _menuSite = null;
            }
        }
    
  7. 了解です。今、それは、上手く動作します!しかし、あなたが、ParentWindow MenuやToolBarsを押すと、 このウィンドウは、( VS2010のようではなく)アクティブとして表示されます。
  8. DockingManagerプロパティに追加します。

    
    public Window ParentWindow
        {
            get { return this.GetNearestLogicalAncestor(); }
        }
    

    ここで拡張メソッド

    
    public static TType GetNearestLogicalAncestor<TType>(this DependencyObject dependencyObject) where TType : DependencyObject
        {
            if (dependencyObject == null)
            {
                return null;
            }
    
            var parent = LogicalTreeHelper.GetParent(dependencyObject);
            if (parent is TType)
            {
                return (TType)parent;
            }
    
            return GetNearestLogicalAncestor<TType>(parent);
        }
    
  9. このハックの追加します。
  10. 
    
    
    private bool flag; private HwndSource hwndSource; private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { // Trace.WriteLine(msg); if (msg == 134 && flag) { handled = true; flag = false; } return IntPtr.Zero; } protected void AddHookToParentWindow() { hwndSource = PresentationSource.FromVisual(ParentWindow) as HwndSource; if (hwndSource != null) { hwndSource.AddHook(WndProc); } } private void DockingManager_Loaded(object sender, RoutedEventArgs e) { Debug.WriteLine("DockingManager Loaded"); if (!DesignerProperties.GetIsInDesignMode(this)) { foreach (FloatingWindow floatingWindow in _floatingWindows) { floatingWindow.Owner = Window.GetWindow(this); if (floatingWindow.IsVisible) { floatingWindow.Hide(); } floatingWindow.Show(); } DragPaneServices.Register(this); } AddHookToParentWindow(); _isControlLoaded = true; }

これは、すべてです。 質問は、v-makarevich@mail.ruに、

このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」