keerth516 Ответов: 3

событие щелчка кнопки внутри всплывающего окна в WPF любая идея?


Привет, я пытаюсь достичь функциональности Outlook style of Datepicker control.

У меня есть текстовое поле, которое применяет стиль, который выглядит точно так же, как в Outlook, но моя проблема заключается в том, что всплывающее окно имеет календарь и две кнопки, как сегодня, и ни одной.Как только щелкните на кнопке сегодня значение текстового поля следует установить дату и если я нажимаю нет текстовое поле Значение, чтобы установить, как никто.

Стиль, который я использовал, таков:
<Style x:Key="tbCalendarStyle" TargetType="{x:Type TextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                        <Border BorderThickness="1" BorderBrush="DarkGray">
                            <ScrollViewer x:Name="PART_ContentHost" />
                        </Border>
                        <ToggleButton Template="{StaticResource IconButton}"

                              MaxHeight="21" 

                              Margin="-1,0,0,0" 

                              Name="PopUpImageButton" 

                              Focusable="False"

                              IsChecked="False">
                            <ToggleButton.Content>
                                <Path x:Name="btnArrow4" Margin="4" VerticalAlignment="Center" Width="10" Fill="Black" Stretch="Uniform" HorizontalAlignment="Right" Data="F1 M 301.14,-189.041L 311.57,-189.041L 306.355,-182.942L 301.14,-189.041 Z "/>
                            </ToggleButton.Content>                        
                            

                        </ToggleButton>
                        <Popup IsOpen="{Binding Path=IsChecked, ElementName=PopUpImageButton, Mode=TwoWay}" x:Name="CustomPopup" Margin="0,-1,0,0" PopupAnimation="Fade" StaysOpen="False">
                           
                            <StackPanel Orientation="Vertical" removed="BlueViolet">
                                <Grid >
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="164"/>
                                        <RowDefinition Height="10"/>
                                    </Grid.RowDefinitions>
                                    <Calendar Grid.Row="0" Margin="0,-1,0,0" x:Name="CalDisplay"

                                      SelectedDate="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Text, Mode=TwoWay, Converter={StaticResource calendarConverter}}" 

                                      Focusable="False" 

                                      DisplayDate="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Text, Mode=OneWay, Converter={StaticResource calendarConverter}}"    

                                      >
                                        <Control.Triggers>
                                            <EventTrigger RoutedEvent="Calendar.SelectedDatesChanged">
                                                <BeginStoryboard>
                                                    <Storyboard>
                                                        <BooleanAnimationUsingKeyFrames Storyboard.TargetName="PopUpImageButton" Storyboard.TargetProperty="IsChecked">
                                                            <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False"></DiscreteBooleanKeyFrame>
                                                        </BooleanAnimationUsingKeyFrames>
                                                    </Storyboard>
                                                </BeginStoryboard>
                                            </EventTrigger>
                                        </Control.Triggers>
                                    </Calendar>
                                </Grid>
                                <StackPanel Orientation="Horizontal" FlowDirection="LeftToRight">
                                    <Button Content="Today" Grid.Row="1" Width="50" VerticalAlignment="Center" Margin="20 0 0 10" Name="btnToday">
                                        <Button.Triggers>
                                            <EventTrigger RoutedEvent="Button.Click">
                                                // what should i do to achieve the above logic
                                            </EventTrigger>
                                        </Button.Triggers>
                                    </Button>

                                    <Button Content="None" Grid.Row="1" Margin="30 0 0 10" Width="50" VerticalAlignment="Center" Name="btnNone">
                                        <Button.Triggers>
                                            <EventTrigger RoutedEvent="Button.Click">

                                            </EventTrigger>
                                        </Button.Triggers>
                                    </Button>
                                </StackPanel>
                            </StackPanel>
                        </Popup>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="Visibility" TargetName="PopUpImageButton" Value="Visible" />
                        </Trigger>
                        <Trigger Property="IsFocused" Value="true">
                            <Setter Property="Visibility" TargetName="PopUpImageButton" Value="Visible" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>



Любая помощь или идея для достижения этой цели будут высоко оценены.

3 Ответов

Рейтинг:
1

keerth516

Созданный пользовательский элемент управления для вышеуказанного элемента управления выбора времени стиля outlook


Рейтинг:
0

Alexander Dymshyts

Если можете попробуйте следующее:

<Button Content="Today" Grid.Row="1" Width="50" VerticalAlignment="Center" Margin="20 0 0 10" Name="btnToday" Command="{Binding MyCommand}"/>

В вашем viewModel вам нужно написать следующее:
private ICommand _myCommand;
public ICommand MyCommand
{
    get
    {
        if (_myCommand != null) return _myCommand;

        _myCommand = new RelayCommand(OnClick);
        return _myCommand;
    }
}

И ваш метод для этой команды должен выглядеть так :
private void OnClick(object sender)
{
//your code
}


keerth516

Спасибо, Александр !!! к сожалению, в данный момент я не использую структуру MVVM в WPF.Любая другая идея или процесс для достижения этой цели?

Alexander Dymshyts

Вы пробовали использовать Click event?

keerth516

Спасибо за помощь , я разобрался со своей проблемой и имплантировал ausercontrol

Alexander Dymshyts

Добро пожаловать

Рейтинг:
0

Alexanbu

If you have a custom control then I suggest you to override the method OnApplyTemplate and use GetTemplatedChild to find the Button, subscribe to its click and thats it except you will have to find the TextBox and set its Text inside the handler.

If you cannot do so for whatever reason here is a small trick how to make it still work

1.Take a look at this:


<resourcedictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
описание:х="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WPFControls.Общий"
xmlns:local="clr-пространство имен:WPFControls">


<setter property="шаблон">
&ЛТ;сеттер.значение&ГТ;
<controltemplate targettype="{x:Type local:MyChildControl}">
<border background="{TemplateBinding Background}">
SnapsToDevicePixels="True"&gt;
<stackpanel>
<textbox x:name="tbx1" xmlns:x="#unknown" />
<button content="{TemplateBinding Content}" click="OnClick" />
</stackpanel>
</граница>
</controltemplate>
</setter.value>
</сеттер>

....

2.и добавьте этот код
общественный разделяемого класса универсального
{
общественная недействительным onclick(объект отправителя, RoutedEventArgs е)
{
MyChildControl control = FindAncestor<mychildcontrol>((DependencyObject)отправитель);
Текстовое поле Данные = контроль.Шаблон.FindName("tbx1", control) в виде текстового поля;
ТБХ.Текст = "это работает!";
}

public static T FindAncestor<t>(DependencyObject current) где T : DependencyObject
{
ток = запись visualtreehelper.GetParent(текущий);

в то время как (ток != нуль)
{
если (ток равен T)
{
возвратный ток (T);
}

ток = запись visualtreehelper.GetParent(текущий);
};

возвращать null;
}
}

3.Это мой файл MainWindow.язык XAML:

<window .... ="">
<сетка>
&ЛТ;местные:содержание mychildcontrol="нажми меня!" атрибутов xmlns:местные="#неизвестный"&ГТ;


keerth516

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