2013-11-12 4 views
5

Я создал пользовательский элемент управления. Возможно ли, чтобы я добавил событие щелчка, чтобы, когда кто-то щелкнет в любом месте области управления, происходит событие щелчка?Как создать событие click на пользовательском элементе управления?

пользовательский элемент управления определяется как:

XAML:

<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}"> 
    <StackPanel Orientation="Vertical"> 
     <Image Source="{Binding TabItemImage}" HorizontalAlignment="Center" Stretch="None" VerticalAlignment="Top" /> 
     <TextBlock Text="{Binding TabItemText}" FontSize="15" HorizontalAlignment="Center" VerticalAlignment="Bottom" /> 
    </StackPanel> 
</Grid> 

C#:

public partial class TabItem : UserControl 
{ 
    public static readonly DependencyProperty ImageProperty = DependencyProperty.Register("TabItemImage", typeof(string), typeof(TabItem), null); 
    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("TabItemText", typeof(string), typeof(TabItem), null); 

    public string TabItemImage 
    { 
     get { return (string)GetValue(ImageProperty); } 
     set { SetValue(ImageProperty, value); } 
    } 

    public string TabItemText 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

    public TabItem() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 
} 

С использованием просто:

<tabs:TabItem TabItemText="OVERVIEW" TabItemImage="/Resources/Images/overview.png" /> 

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

<tabs:TabItem 
    TabItemText="OVERVIEW" 
    TabItemImage="/Resources/Images/options_64.png" 
    Click="TabItem_Clicked"/> <!-- when someone clicks the control, this fires --> 

Возможно ли это? Если да, что мне нужно сделать, чтобы создать событие click на пользовательском элементе управления?

+1

http://msdn.microsoft.com/en-us/library/bb514616(v = vs.90) .aspx, вы можете использовать присоединенное событие Button.Click = "myHandler" –

ответ

2

sthotakura, имеет хороший момент, и это был бы отличный способ сделать это. Однако, если у вас не более одного события click для этого UserControl, почему вы просто не используете какое-либо из числа событий mouseclick, связанных с определением пользовательского UserControl.

Я не знал, что вы можете установить datacontext для себя ... Это интересно. Я собираюсь изменить пользовательский диалог, который я создал сейчас. :) Спасибо, что научил меня чему-то.


XAML:

<UserControl x:Class="StackTest.TestControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      MouseLeftButtonUp="TestControl_OnMouseLeftButtonUp" 
      MouseDoubleClick="TestControl_OnMouseDoubleClick" 
      MouseLeftButtonDown="TestControl_OnMouseLeftButtonDown"> 

    <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}"> 
    <StackPanel Orientation="Vertical"> 
     <Image Source="{Binding TabItemImage}" HorizontalAlignment="Center" Stretch="None" VerticalAlignment="Top" /> 
     <TextBlock Text="{Binding TabItemText}" FontSize="15" HorizontalAlignment="Center" VerticalAlignment="Bottom" /> 
    </StackPanel> 
    </Grid> 

</UserControl> 

CS:

public partial class TestControl : UserControl 
{ 
    public static readonly DependencyProperty ImageProperty = DependencyProperty.Register("TabItemImage" , typeof(string) , typeof(TabItem) , null); 
    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("TabItemText" , typeof(string) , typeof(TabItem) , null); 

    public string TabItemImage 
    { 
     get { return (string)GetValue(ImageProperty); } 
     set { SetValue(ImageProperty , value); } 
    } 

    public string TabItemText 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty , value); } 
    } 

    public TestControl() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

    // or 

    private void TestControl_OnMouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     // Add logic... 
    } 

    // or 

    private void TestControl_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     // Add logic... 
    } 

    // or 

    private void TestControl_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     // Add logic... 
    } 
} 
4

Вам нужно добавить пользовательские RoutedEvent к вашему TabItem UserControl, Ниже код для добавления пользовательского RoutedEvent:

public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent(
"Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(TabItem)); 

public event RoutedEventHandler Click 
{ 
    add { AddHandler(ClickEvent, value); } 
    remove { RemoveHandler(ClickEvent, value); } 
} 

void RaiseClickEvent() 
{ 
    RoutedEventArgs newEventArgs = new RoutedEventArgs(TabItem.ClickEvent); 
    RaiseEvent(newEventArgs); 
} 

void OnClick() 
{ 
    RaiseClickEvent(); 
} 

, а затем в вашем UserControl InitializeMethod провода до PreviewMouseLeftButtonUp случае стрелять ваш заказ RoutedEvent:

PreviewMouseLeftButtonUp += (sender, args) => OnClick(); 

В MSDN обсуждается это довольно хорошо How-to, вы можете прочитать это.

0

Таким образом, я могу aswer на большой Почтой Sthotakura.

это ваш пост с всем пространством имен нуждается

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

    namespace YourNameSpace 
    { 
     partial class OPButton 
     { 
      /// <summary> 
      /// Create a custom routed event by first registering a RoutedEventID 
      /// This event uses the bubbling routing strategy 
      /// see the web page https://msdn.microsoft.com/EN-US/library/vstudio/ms598898(v=vs.90).aspx 
      /// </summary> 
      public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(OPButton)); 
      /// <summary> 
      /// Provide CLR accessors for the event Click OPButton 
      /// Adds a routed event handler for a specified routed event Click, adding the handler to the handler collection on the current element. 
      /// </summary> 
      public event RoutedEventHandler Click 
      { 
       add {AddHandler(ClickEvent, value); } 
       remove { RemoveHandler(ClickEvent, value); } 
      } 
      /// <summary> 
      /// This method raises the Click event 
      /// </summary> 
      private void RaiseClickEvent() 
      { 
       RoutedEventArgs newEventArgs = new RoutedEventArgs(OPButton.ClickEvent); 
       RaiseEvent(newEventArgs); 
      } 
      /// <summary> 
      /// For isPressed purposes we raise the event when the OPButton is clicked 
      /// </summary> 
      private void OnClick() 
      { 
       RaiseClickEvent(); 
      } 
     } 
    } 

Добавьте следующие ссылки:

Windows; 
PresentationCore; 
WindowsBase; 
+0

Как это делается в WinRT/UWP? Спасибо. –

+0

Здравствуйте, Jasper, Вы можете прочитать по этой ссылке, https://dev.windows.com/en-us/design или вы пытались выполнить поиск по Google или другому? –

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

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