Alexander
- Вопросы
- Ответы
Имя | Ояябу! |
Возраст | 27 |
Сайт | Неизвестно |
Неизвестно | |
Участвует в проекте | 1112 дн., 19 час., 31 мин. |
Последняя активность | 503 дн., 2 час., 41 мин. назад |
Ответы
Перейти к вопросу →
Самый простой способ - это определить обработчик на событие GotFocus окна. Благодаря маршрутизации событий события получения фокуса у дочерних элементов будут обрабатываться обработчиком окна. Это не сработает, если у самого дочернего элемента на данное событие назначен обработчик, в котором значение e.Handled устанавливается в true.
Перейти к вопросу →
В общем, такой поиск может выглядеть так:
public static class ExtensionMethods
{
private static void GetAllInstancesRecursive(IApplicationContext context,
Type serviceType,
ref ICollection<object> result)
{
if (context == null) return;
foreach (object o in context.GetObjectsOfType(serviceType).Values)
{
result.Add(o);
}
GetAllInstancesRecursive(context.ParentContext, serviceType, ref result);
}
public static IEnumerable<object> GetObjectsOfTypeRecursive(this IApplicationContext context,
Type serviceType)
{
ICollection<object> result = new Collection<object>();
GetAllInstancesRecursive(context, serviceType, ref result);
return result;
}
}
Перейти к вопросу →
Наверное никак. В общем-то все логично. ParentContext
заполняется из xml, а регистрация из кода идет непосредственно в GenericApplicationContext
, который является контейнером сам по себе. Так что метод GetObjectsOfType
ищет только там, где он вызван.
Хотя... с другой стороны данный метод определен в классе AbstractApplicationContext
, где определено так же и свойство ParentContext
. Почему бы этому методу не искать рекурсивно во всех ParentContext'ах?
Или все же возможно сконфигурировать контейнер для такого поиска?
Перейти к вопросу →
Вот тут пишут, что дело может быть в пространствах имен WPF - при построении дерева элементов из code behind нужно указывать пространства имен явно. Попробовал изменить код из вопроса следующим образом:
private T CreateContent<T>(object view, IExtendedPresenter model)
where T : ManagedContent, new()
{
(view as FrameworkElement).Name = "view";
INameScope s = new NameScope();
var contentControl = new T { Content = view, Name = "contentControl"};
NameScope.SetNameScope(contentControl, s);
s.RegisterName("contentControl", contentControl);
contentControl.RegisterName("view", view);
contentControl.SetBinding(
ManagedContent.TitleProperty,
"Title"
);
_binder.Bind(model, contentControl, null);
return contentControl;
}
но ничего не изменилось. По прежнему поиск возвращает null
. В чем же дело, товарище разработчике?
Перейти к вопросу →
А что если использовать стиль?
...
<ToolBar Grid.Row="0">
<ToolBar.Resources>
<Style x:Key="bindingButtonStyle" TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=IsButtonsEnabled}"/>
</Style>
</ToolBar.Resources>
<Button Content="Button1" Style="{StaticResource bindingButtonStyle}" />
<Button Content="Button2" />
<Button Content="Button3" Style="{StaticResource bindingButtonStyle}"/>
При этом кнопки, к которым применен стиль, получат привязку. Ну, либо все кнопки, если стилю не задавать ключ.
Перейти к вопросу →
Не, я не в конструкторе пробовал.
FrameworkElement source = (FrameworkElement) message.Source.UIElement;
Popup popup = source.FindName<Popup>("popupErrors", true);
ItemsControl list = popup.FindName<ItemsControl>("errorsList", true);
list.ItemsSource = _validationResults;
var sourceOffset = source.TransformToVisual(Application.Current.MainWindow).Transform(new Point(0, 0));
var popupOffset = popup.TransformToVisual(Application.Current.MainWindow).Transform(new Point(0, 0));
popup.IsOpen = true;
popup.HorizontalOffset = sourceOffset.X - popupOffset.X - popup.ActualWidth;
popup.Child.MouseLeave += delegate { popup.IsOpen = false; };
Перейти к вопросу →
В общем, NaN - это значение по-умолчанию для Width и в данном случае может интерпретироваться как "не установлено". Width - это "желаемая" ширина FrameworkElement'а, в то время как ActualWidth - ширина элемента, определяемая при отрисовке этого элемента (т.о. доступна только для чтения). Рекомендуется ориентироваться на нее.
Но тут у меня опять проблема - она равна 0.0 почему-то... Хотя визуально элемент виден.
Перейти к вопросу →
По словам Неназываемого "Настоящему программисту не нужны никакие языки программирования!". А на счет MVP - это все фигня, все давно уже перешли на linux!!! Учите матчасть, автор.