原文
Add solution to resolve binding problems(外部サイト)
訳文
結合問題に解決策を追加する
Add solution to resolve binding problems
解説
Hellow!英語がへたくそで、ごめんなさい。
私は、自分のプロジェクトでAvalonDock 1.3を使用し、すべて結合を保存し、いくつかのフォーカスの問題を解決する、簡単な方法を見つけました。!!!
フレームワーク4.0かそれ以降を使用してください。
- DockingManagerとFloatingWindowクラスの2つのメソッドを追加します。
- DockingManagerClassの、1つのメソッドを変更します。
- いいね!次に、私たちは、いくつかのフォーカスの問題を解決します。この記事は、私の役に立ちます。
- 了解です。今、それは、上手く動作します!しかし、あなたが、ParentWindow MenuやToolBarsを押すと、 このウィンドウは、( VS2010のようではなく)アクティブとして表示されます。
- このハックの追加します。
internal void AddLogicalChild(FrameworkElement frameworkElement)
{
base.AddLogicalChild(frameworkElement);
}
internal void RemoveLogicalChild(FrameworkElement frameworkElement)
{
base.RemoveLogicalChild(frameworkElement);
}
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);
}
}
親ウィンドウのコンストラクタで、この静的プロパティを設定します。
// 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;
}
}
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);
}
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に、