У меня проблема, когда я не могу заставить FocusManager распознавать, когда элемент управления ленты имеет фокус.
Логика проста. Я ставлю фокус на текстовое поле. Я пробовал как RibbonText, так и Textbox. Я вижу, что когда я щелкаю текстовое поле, срабатывает событие GotFocus, показывая, что теперь оно имеет фокус. Когда я перемещаю мышь на холсте, текстовое поле должно обновляться, но этого не происходит. FocusManager.GetFocusedElement возвращает значение null. Я попробовал это с помощью строки состояния и добавил текстовое поле. Используя строку состояния, GetFocusedElement возвращает текстовое поле.
Точно такой же код работал, когда я использовал сетку с двумя столбцами. В сетке был холст в левом столбце и панель стека с несколькими элементами управления-расширителями с текстовыми полями в них в правом столбце. Право было слишком занято слишком большим количеством элементов управления расширения, поэтому я переключился на управление лентой, поскольку несколько вкладок и другие функции сделали его оптимальным выбором.
Я пробовал все комбинации настроек "Focusable", но это не помогает.
<ribbon:RibbonWindow x:Class="WpfRibbonApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
Title="MainWindow" x:Name="RibbonWindow" Width="640" Height="480">
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ribbon:Ribbon x:Name="Ribbon">
<ribbon:Ribbon.ApplicationMenu>
<ribbon:RibbonApplicationMenu SmallImageSource="Images\SmallIcon.png">
<ribbon:RibbonApplicationMenuItem Header="Hello _Ribbon" x:Name="MenuItem1" ImageSource="Images\LargeIcon.png"/>
</ribbon:RibbonApplicationMenu>
</ribbon:Ribbon.ApplicationMenu>
<ribbon:RibbonTab x:Name="HomeTab"
Header="Home">
<ribbon:RibbonGroup x:Name="Group1"
Header="Group1">
<TextBox Name="Try" Width="200" GotFocus="Try_GotFocus"></TextBox>
</ribbon:RibbonGroup>
</ribbon:RibbonTab>
</ribbon:Ribbon>
<Canvas Grid.Row="1" Height="250" Margin="0,5,0,0" Name="canvas1" Background="AliceBlue" VerticalAlignment="Top" MouseMove="canvas1_MouseMove" />
</Grid>
</ribbon:RibbonWindow>
using Microsoft.Windows.Controls.Ribbon;
namespace WpfRibbonApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : RibbonWindow
{
public MainWindow()
{
InitializeComponent();
}
private void canvas1_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
{
System.Windows.Point p = e.GetPosition(canvas1);
var fe = FocusManager.GetFocusedElement(this);
if (fe != null)
{
var element = fe as FrameworkElement;
if (element.Name == "Try")
{
Try.Text = "Canvas has Focus";
}
}
}
}
private void Try_GotFocus(object sender, RoutedEventArgs e)
{
Try.Text = "Got Focus";
}
}
}