Числовой элемент управления UpDown с использованием свойств зависимостей - PullRequest
0 голосов
/ 14 марта 2012

Так что я в растерянности, чтобы понять это. У меня есть пользовательский элемент управления, который использует кнопки вверх / вниз для увеличения / уменьшения времени, отображаемого на кнопках переключения. У меня есть свойство Content Toggles, отображающее правильные значения свойств Hour и Minute, и сейчас я пытаюсь настроить код для увеличения значений. Согласно отладчику VS2010, увеличивает * значение свойства Hour на , но не изменяет содержимое переключателей, чтобы отразить это. У меня установлен режим привязки TwoWay, и я использую {Binding RelativeSource={RelativeSource TemplatedParent}, Path=Hour, Mode=TwoWay} для привязки к значению, так как оно находится в файле generic.xaml пользовательского элемента управления. Любые идеи о том, как правильно отобразить отображаемое значение?

XAML: (шаблоны стилей удалены для экономии места)

    <Style TargetType="{x:Type local:TimePicker}">
    <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height}" />
    <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Width}" />
    <Setter Property="HorizontalAlignment" Value="Center" />
    <Setter Property="VerticalAlignment" Value="Center" />
    <Setter Property="FontSize" Value="14" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="Transparent"
                        BorderThickness="1">
                    <StackPanel  x:Name="PART_Root"
                                 Orientation="Horizontal"
                                 HorizontalAlignment="Center"
                                 VerticalAlignment="{TemplateBinding VerticalAlignment}">
                        <!--Region Hour Button-->
                        <ToggleButton x:Name="PART_Hour"
                                      VerticalAlignment="{TemplateBinding VerticalAlignment}"
                                      Margin="0"
                                      BorderBrush="Transparent"
                                      BorderThickness="0"
                                      Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Hour, Mode=TwoWay, BindsDirectlyToSource=True}">                                
                        </ToggleButton>
                        <!--EndRegion-->
                        <Label HorizontalContentAlignment="{TemplateBinding HorizontalAlignment}"
                               VerticalContentAlignment="{TemplateBinding VerticalAlignment}"
                               FontSize="14"
                               Content=":"/>
                        <!--Region Minute Button-->
                        <ToggleButton x:Name="PART_Minute"
                                      VerticalAlignment="{TemplateBinding VerticalAlignment}"
                                      Margin="0"
                                      BorderBrush="Transparent"
                                      Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Minute}">                                
                        </ToggleButton>
                        <!--EndRegion-->
                        <StackPanel x:Name="PART_IncDecPanel"
                                    HorizontalAlignment="Center"
                                    VerticalAlignment="Center"
                                    Orientation="Vertical">
                            <Grid Height="{Binding ElementName=PART_Hour, Path=ActualHeight}">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*"/>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <Viewbox Stretch="Fill" Grid.Row="0">
                                    <!--Region Increase Button-->
                                    <Button x:Name="PART_IncreaseTime"
                                            HorizontalContentAlignment="{TemplateBinding HorizontalAlignment}"
                                            VerticalContentAlignment="{TemplateBinding VerticalAlignment}"
                                            BorderBrush="Transparent"
                                            BorderThickness="0"
                                            FontFamily="Marlett"
                                            Foreground="DimGray"
                                            Content="5"
                                            Padding="0"
                                            Click="PART_IncreaseTime_Click">                                            
                                    </Button>
                                    <!--EndRegion-->
                                </Viewbox >
                                <Viewbox Stretch="Fill" Grid.Row="1">
                                    <!--Region Decrease Button-->
                                    <Button x:Name="PART_DecreaseTime"
                                            HorizontalContentAlignment="{TemplateBinding HorizontalAlignment}"
                                            VerticalContentAlignment="{TemplateBinding VerticalAlignment}"
                                            BorderBrush="Transparent"
                                            BorderThickness="0"
                                            FontFamily="Marlett"
                                            Foreground="DimGray"
                                            Content="6"
                                            Padding="0">                                            
                                    </Button>
                                    <!--EndRegion-->
                                </Viewbox>
                            </Grid>

                        </StackPanel>

                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Код:

public class TimePicker : Control
{
    #region Dependency Property Declarations
    public static DependencyProperty HourProperty = DependencyProperty.Register("Hour", typeof(int), typeof(TimePicker),
        new FrameworkPropertyMetadata((int)12, new PropertyChangedCallback(OnHourChanged)));

    public static DependencyProperty MinuteProperty = DependencyProperty.Register("Minute", typeof(string), typeof(TimePicker),
        new FrameworkPropertyMetadata((string)"00", new PropertyChangedCallback(OnMinuteChanged)));        

    #endregion

    #region Properties
    public int Hour
    {
        get { return (int)GetValue(HourProperty); }
        set { SetValue(HourProperty, value); }
    }

    public string Minute
    {
        get { return (string)GetValue(MinuteProperty); }
        set { SetValue(MinuteProperty, value); }
    }
    #endregion

    #region Events
    private static void OnHourChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        TimePicker time = new TimePicker();
        time.Hour = (int)e.NewValue;
        MessageBox.Show("Hour changed");
    }

    private static void OnMinuteChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {

    }
    #endregion

    static TimePicker()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(TimePicker), new FrameworkPropertyMetadata(typeof(TimePicker)));
    }
}

public partial class TimePickerEvents : ResourceDictionary
{
    TimePicker time = new TimePicker();

    void PART_IncreaseTime_Click(object sender, RoutedEventArgs e)
    {
        time.Hour += 1;

    }
}   

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Не уверен, почему вы используете Togglebutton для отображения часов / минут, я думаю, что Label / TextBlock подойдет для этого лучше.*

Затем в коде переопределите OnApplyTemplate как таковое

public override void OnApplyTemplate()
{
    var upButton = GetTemplateChild("PART_IncreaseTime") as Button;
    upButton.Click += IncreaseClick;

    var downButton = GetTemplateChild("PART_DecreaseTime") as Button;
    downButton.Click += DecreaseClick;
}

private void IncreaseClick(object sender, RoutedEventArgs e)
{
    // Here would be a place to see what toggle button is checked 
    // (or which TextBlock last had focus) and increase Hour/Minute
    // based on that info
    Hour += 1;
}

private void DecreaseClick(object sender, RoutedEventArgs e)
{
    // Here would be a place to see what toggle button is checked 
    // (or which TextBlock last had focus) and decreaseHour/Minute
    // based on that info
    Hour -= 1;
}

Это должно помочь вам начать.К вашему сведению: в ваших OnHourChanged и OnMinuteChanged отправитель является вашим элементом управления (TimePicker).Таким образом, вы можете привести отправителя к TimePicker и получить доступ ко всем вашим свойствам.Даже ваша частная собственность.

0 голосов
/ 14 марта 2012

Почему бы вам не использовать числовой контроль вверх инструментария WPF? http://wpftoolkit.codeplex.com/wikipage?title=NumericUpDown

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

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