2015-12-16 3 views
0

Я хочу использовать следующий код XAML для навигации в некоторых страницах:МОФ XAML словаря ресурсов добавить настраиваемое свойство

<Button Content="Go to page2"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Click"> 
      <ei:ChangePropertyAction PropertyName="Source" TargetObject="{Binding NavigationService, RelativeSource={RelativeSource AncestorType={x:Type Page}, Mode=FindAncestor}}"> 
       <ei:ChangePropertyAction.Value> 
        <System:Uri>Page2.xaml</System:Uri> 
       </ei:ChangePropertyAction.Value> 
      </ei:ChangePropertyAction> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Button> 

Так I'm интересно, если есть возможность перенесет часть взаимодействия в стиль (в ресурсном словаре) и добавьте настраиваемое свойство, например «NavigationUri», где вы можете прямо объявить страницу для навигации.
Другая идея (вероятно, лучший подход) заключается в создании пользовательского элемента управления и наследования из класса кнопок. В любом месте я бы предпочел более компактный и худой способ без кода.

Пожалуйста, дайте мне знать, что является более подходящим решением и как его реализовать.

ответ

1

Хотя существуют различные простые приемы, чтобы сделать наше поведение Xaml статическим ресурсом. Но нам нужно настраивать поведение, поскольку мы используем параметр в виде имени страницы для перехода к. Эта переменная требует программирования.

Итак, я придумал

a. Пользовательское поведение (NavigationBehavior) и

b.Кнопка подклассов (NavigationButton)

NavigationBehavior

using System; 
using System.Windows.Controls; 
using System.Windows.Interactivity; 

namespace WpfApplication1.Navigation 
{ 
    public class NavigationBehavior:Behavior<NavigationButton> 
    { 
     protected override void OnAttached() 
     { 
      AssociatedObject.Click += AssociatedObject_Click; 
      base.OnAttached(); 
     } 

     void AssociatedObject_Click(object sender, System.Windows.RoutedEventArgs e) 
     { 
      ((Page)AssociatedObject.DataContext).NavigationService.Source = new Uri(AssociatedObject.DestinationUri, UriKind.Relative); 
     } 
    } 
} 

NavigationButton

namespace WpfApplication1.Navigation 
{ 
    public class NavigationButton : Button 
    { 
     NavigationBehavior behavior = new NavigationBehavior(); 

     public NavigationButton() 
     {    
      behavior.Attach(this); 
     } 

     public string DestinationUri { get; set; } 
    } 
} 

Использование:

<nav:NavigationButton Content="Navigate to Page2" DestinationUri="/Navigation/Page2.xaml" /> 

Важное примечание

  1. Мы используем DataContext свойство в нашем поведении, чтобы получить доступ к странице, содержащей. Итак, установите this.DataContext = this; в конструкторе всех ваших страниц.

Чтобы избежать этого, можно использовать общий базовый класс/интерфейс.

0

вы не можете иметь взаимодействие триггеров извлеченные но есть обходной путь, чтобы получить это сделать

вы можете создать кнопки в ресурсах с логикой взаимодействия в ней, а затем в случае необходимости вы можете иметь контроль контента с набором контента для ваш ресурс.

что-то вроде этого -

<Window.Resources> 
    <Button x:Key="MyButton" 
    Content="Go to page2"> 
<i:Interaction.Triggers> 
    <i:EventTrigger EventName="Click"> 
     <ei:ChangePropertyAction PropertyName="Source" TargetObject="{Binding NavigationService, RelativeSource={RelativeSource AncestorType={x:Type Page}, Mode=FindAncestor}}"> 
      <ei:ChangePropertyAction.Value> 
       <System:Uri>Page2.xaml</System:Uri> 
      </ei:ChangePropertyAction.Value> 
     </ei:ChangePropertyAction> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 
</Button> 
</Window.Resources> 


<Grid> 
    <ContentControl Name="MyLocalButton" Content="{StaticResource MyButton}" /> 
</Grid> 
+0

Но мне нужно изменить страницу, переместив ее на –

0

Вы должны поставить навигационную логику в команде в модели представления каждой страницы и связать свойства командной кнопки для этих команд, либо придают моделям зрения, каждый, СледующаяСтраница свойство и привязать его к этому.

И создайте отдельные кнопки в представлениях. Определите стиль в словаре ресурсов, чтобы все они выглядели одинаково.

Определение кнопки в качестве ресурса - плохая идея. Среди прочего, есть только один экземпляр, и он может иметь только один визуальный родитель, поэтому, когда вы добавляете его в один вид, он исчезнет из последнего. И вы сталкиваетесь с такими уродливыми проблемами, как этот. Вы работаете против XAML, и XAML уже достаточно сложно, когда вы работаете с ним.

+0

. Для прототипа это слишком далеко. –

+0

@veritas Если вы спасли столько времени, делая это неправильно, почему вы на SO спрашиваете, как заставить его работать? Вы попросили более подходящее решение. Это оно. –

+0

Я мог бы указать, что это прототип, возможно, мне пришлось использовать SketchFlow или sth: D –

Смежные вопросы