WPF Sayısal Yukarı Aşağı denetimi nerede?


124

İlk ciddi WPF projesine giriş. Görünüşe göre birçok temel kontrol eksik görünüyor. Özellikle, Sayısal Yukarı Aşağı denetimi arıyorum. Kaçırdığım bir grup dışı yayın var mıydı? Gerçekten kendi kontrolümü yazmak istemiyorum.

WindowsFormHost'u kullanmak ve üzerine bir WinForm ctl yerleştirmek istemiyorum. Herhangi bir miras çöpü olmadan tamamen WPF olmasını istiyorum.

Teşekkürler


4
Extented WPF Toolkit'te bir tane var: NumericUpDown ! alternatif metin
Eduardo Molteni

21
Bu tek yorum, blogumun tüm zamanlardaki en büyük trafiği. Bu gün bile. Neşeli.
Kevin Moore


3
Soru "WPF sayısal UpDown denetimi nerede" dir. Bu yanıtların hiçbiri bu soruyu yanıtlamıyor. Cevap türünün "wpf'de ondan kurtulmaya karar verdiler çünkü ..." şeklinde olmasını beklerdim. Ancak bu cevabı bilmiyorum
Assimilater

2
WPF Toolkit, çözdüğünden çok daha fazla sorun çıkarır, pek çok bariz hata içerir; ve Microsoft'tan NumericUpDown kontrolü yok ... cehennem, WPF artık yaşıyor mu?
j00hi

Yanıtlar:


48

Sadece xtended wpf araç setindekiIntegerUpDown kontrolü kullanın Bunu şu şekilde kullanabilirsiniz:

  1. XAML'nize aşağıdaki ad alanını ekleyin:

    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"

  2. XAML'nizde kontrol kullanmak istediğiniz yerde:

    <xctk:IntegerUpDown Name="myUpDownControl" />


6
Üçüncü taraf kapalı kaynak denetimlerini merak edenler / bunlardan rahatsız olanlar için, bu kitaplığın ücretsiz sürümünün Microsoft Kamu Lisansı altında yayınlandığını unutmayın; bu, temelde arkasındaki tam kaynak kodunu alacağınız anlamına gelir (ayrıntılar için tam lisans metnini okuyun). UpDown kontrolleri ücretsiz sürümün parçasıdır. Ayrıca, çok daha fazla kontrol / tema içeren kütüphanenin ücretli bir sürümü de vardır.
JRH

Kolaylık sağlamak için bu özel WPF denetimlerinin VS Araç Kutusunda görünmesini sağlamanın bir yolu var mı? Bunları 'Araçlar -> Araç Kutusu Öğelerini Seçin' altında bulamadım.
aviator

2
V3.7.0 sürümünden başlayarak, wpftoolkit'in açık kaynaklı sürümünün MS-PL ( referans ) yerine tescilli ticari olmayan bir lisans altında sağlandığına dikkat edilmelidir
Jordoff

46

Ben kendim yaptım;

xaml

<StackPanel Orientation="Horizontal">
    <TextBox x:Name="txtNum" x:FieldModifier="private" Margin="5,5,0,5" Width="50" Text="0" TextChanged="txtNum_TextChanged" />
    <Button x:Name="cmdUp" x:FieldModifier="private" Margin="5,5,0,5" Content="˄" Width="20" Click="cmdUp_Click" />
    <Button x:Name="cmdDown" x:FieldModifier="private" Margin="0,5,0,5"  Content="˅" Width="20" Click="cmdDown_Click" />
</StackPanel>

ve arkasındaki kod

private int _numValue = 0;

public int NumValue
{
    get {  return _numValue; }
    set
    {
        _numValue = value;
        txtNum.Text = value.ToString();
    }
}

public NumberUpDown()
{
    InitializeComponent();
    txtNum.Text = _numValue.ToString();
}

private void cmdUp_Click(object sender, RoutedEventArgs e)
{
    NumValue++;
}

private void cmdDown_Click(object sender, RoutedEventArgs e)
{
    NumValue--;
}

private void txtNum_TextChanged(object sender, TextChangedEventArgs e)
{
    if (txtNum == null)
    {
        return;
    }

    if (!int.TryParse(txtNum.Text, out _numValue))
        txtNum.Text = _numValue.ToString();
}

textChanged olayı WPF .net 4'teki bir metin kutusu için mevcut değil
AliR

Bu yöntemin bazı sınırlamaları vardır, 1) TextBox, Winforms'un yaptığı gibi kontrolle yatay olarak esnemez ve daha az önemlisi, 2) Winforms NumericUpDown'dan farklı olarak, bu kontrol zararsız olan ancak biraz aptalca görünen dikey uzatmaya izin verir . Sonorx'un cevabındaki çözümün bu sorunlara sahip olmadığını unutmayın.
JRH

2
NumValue, bağlamaya izin vermek için bir bağımlılık özelliği olmalıdır, ayrıca MinValue ve MaxValue gibi diğer özellikler de iyi olurdu.
Konrad

Bu çözüm berbat. Wpf veri bağlama, yönlendirilmiş olaylar ve komutlar için destek içermeyen özel bir denetimdir.
Xam

18

Bu, Yukarı ve Aşağı tuşlarını yakalayan kendi UserControl'ime bir örnektir.

Xaml kodu:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="13" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="13" />
        <RowDefinition Height="13" />
    </Grid.RowDefinitions>
    <TextBox Name="NUDTextBox"  Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" TextAlignment="Right" PreviewKeyDown="NUDTextBox_PreviewKeyDown" PreviewKeyUp="NUDTextBox_PreviewKeyUp" TextChanged="NUDTextBox_TextChanged"/>
    <RepeatButton Name="NUDButtonUP"  Grid.Column="1" Grid.Row="0" FontSize="8" FontFamily="Marlett" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Click="NUDButtonUP_Click">5</RepeatButton>
    <RepeatButton Name="NUDButtonDown"  Grid.Column="1" Grid.Row="1" FontSize="8"  FontFamily="Marlett" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Height="13" VerticalAlignment="Bottom" Click="NUDButtonDown_Click">6</RepeatButton>
</Grid>

Ve kod:

public partial class NumericUpDown : UserControl
{
    int minvalue = 0, 
        maxvalue = 100,
        startvalue = 10;
    public NumericUpDown()
    {
        InitializeComponent();
        NUDTextBox.Text = startvalue.ToString();
    }

    private void NUDButtonUP_Click(object sender, RoutedEventArgs e)
    {
        int number;
        if (NUDTextBox.Text != "") number = Convert.ToInt32(NUDTextBox.Text);
        else number = 0;
        if (number < maxvalue)
            NUDTextBox.Text = Convert.ToString(number + 1); 
    }

    private void NUDButtonDown_Click(object sender, RoutedEventArgs e)
    {
        int number;
        if (NUDTextBox.Text != "") number = Convert.ToInt32(NUDTextBox.Text);
        else number = 0;
        if (number > minvalue)
            NUDTextBox.Text = Convert.ToString(number - 1); 
    }

    private void NUDTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
    {

        if (e.Key == Key.Up)
        {
            NUDButtonUP.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
            typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(NUDButtonUP, new object[] { true }); 
        }


        if (e.Key == Key.Down)
        {
            NUDButtonDown.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
            typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(NUDButtonDown, new object[] { true }); 
        }
    }

    private void NUDTextBox_PreviewKeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Up)
            typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(NUDButtonUP, new object[] { false });

        if (e.Key == Key.Down)
            typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(NUDButtonDown, new object[] { false });
    }

    private void NUDTextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        int number = 0;
        if (NUDTextBox.Text!="")
            if (!int.TryParse(NUDTextBox.Text, out number)) NUDTextBox.Text = startvalue.ToString();
        if (number > maxvalue)  NUDTextBox.Text = maxvalue.ToString();
        if (number < minvalue) NUDTextBox.Text = minvalue.ToString();
        NUDTextBox.SelectionStart = NUDTextBox.Text.Length;

    }

}

2
"Marlett" yazı tipinin kullanıcının sisteminde olması garantili mi?
Qwertie

@Qwertie Bu, Windows'ta 3.11, AFAIR'den beri varsayılan olarak kullanılmaktadır.
Spook

Bu iyi bir çözüm ve UWP XAML ile de çalışıyor gibi görünüyor. PreviewKeyDown / PreviewKeyUP yöntemleriyle ilgili biraz sorun yaşadım.
raddevus

10
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:numericButton2">


    <Style TargetType="{x:Type local:NumericUpDown}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:NumericUpDown}">              
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <RepeatButton Grid.Row="0" Name="Part_UpButton"/>
                            <ContentPresenter Grid.Row="1"></ContentPresenter>
                            <RepeatButton Grid.Row="2" Name="Part_DownButton"/>
                        </Grid>                  
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

    <Window x:Class="numericButton2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:numericButton2"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <local:NumericUpDown Margin="181,94,253,161" x:Name="ufuk" StepValue="4" Minimum="0" Maximum="20">            
            </local:NumericUpDown>
            <TextBlock Margin="211,112,279,0" Text="{Binding ElementName=ufuk, Path=Value}" Height="20" VerticalAlignment="Top"></TextBlock>
        </Grid>
    </Window>
public class NumericUpDown : Control
{
    private RepeatButton _UpButton;
    private RepeatButton _DownButton;
    public readonly static DependencyProperty MaximumProperty;
    public readonly static DependencyProperty MinimumProperty;
    public readonly static DependencyProperty ValueProperty;
    public readonly static DependencyProperty StepProperty;   
    static NumericUpDown()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericUpDown), new FrameworkPropertyMetadata(typeof(NumericUpDown)));
        MaximumProperty = DependencyProperty.Register("Maximum", typeof(int), typeof(NumericUpDown), new UIPropertyMetadata(10));
        MinimumProperty = DependencyProperty.Register("Minimum", typeof(int), typeof(NumericUpDown), new UIPropertyMetadata(0));
        StepProperty = DependencyProperty.Register("StepValue", typeof(int), typeof(NumericUpDown), new FrameworkPropertyMetadata(5));
        ValueProperty = DependencyProperty.Register("Value", typeof(int), typeof(NumericUpDown), new FrameworkPropertyMetadata(0));
    }
    #region DpAccessior
    public int Maximum
    {
        get { return (int)GetValue(MaximumProperty); }
        set { SetValue(MaximumProperty, value); }
    }
    public int Minimum
    {
        get { return (int)GetValue(MinimumProperty); }
        set { SetValue(MinimumProperty, value); }
    }
    public int Value
    {
        get { return (int)GetValue(ValueProperty); }
        set { SetCurrentValue(ValueProperty, value); }
    }
    public int StepValue
    {
        get { return (int)GetValue(StepProperty); }
        set { SetValue(StepProperty, value); }
    }
    #endregion
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        _UpButton = Template.FindName("Part_UpButton", this) as RepeatButton;
        _DownButton = Template.FindName("Part_DownButton", this) as RepeatButton;
        _UpButton.Click += _UpButton_Click;
        _DownButton.Click += _DownButton_Click;
    }

    void _DownButton_Click(object sender, RoutedEventArgs e)
    {
        if (Value > Minimum)
        {
            Value -= StepValue;
            if (Value < Minimum)
                Value = Minimum;
        }
    }

    void _UpButton_Click(object sender, RoutedEventArgs e)
    {
        if (Value < Maximum)
        {
            Value += StepValue;
            if (Value > Maximum)
                Value = Maximum;
        }
    }

}

9

Verilen cevaplar tamam. Ancak, fare kontrolden çıktığında düğmelerin otomatik olarak gizlenmesini istedim. İşte kodum yukarıdaki vercin cevabına göre :

stil

<Style TargetType="{x:Type v:IntegerTextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type v:IntegerTextBox}">
                    <Grid Background="Transparent">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <TextBox Name="tbmain" Grid.ColumnSpan="2" Grid.RowSpan="2"
                                 Text="{Binding Value, Mode=TwoWay, NotifyOnSourceUpdated=True, 
                            NotifyOnValidationError=True, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type v:IntegerTextBox}}}" 
                                               Style="{StaticResource ValidationStyle}" />
                        <RepeatButton Name="PART_UpButton" BorderThickness="0" Grid.Column="1" Grid.Row="0"
                                      Width="13" Background="Transparent">
                            <Path Fill="Black" Data="M 0 3 L 6 3 L 3 0 Z"/>
                        </RepeatButton>
                        <RepeatButton Name="PART_DownButton" BorderThickness="0" Grid.Column="1" Grid.Row="1"
                                      Width="13" Background="Transparent">
                            <Path Fill="Black" Data="M 0 0 L 3 3 L 6 0 Z"/>
                        </RepeatButton>

                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver"  Value="False">
                            <Setter Property="Visibility" TargetName="PART_UpButton" Value="Collapsed"/>
                            <Setter Property="Visibility" TargetName="PART_DownButton" Value="Collapsed"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

kod

public partial class IntegerTextBox : UserControl
{
    public IntegerTextBox()
    {
        InitializeComponent();
    }

    public int Maximum
    {
        get { return (int)GetValue(MaximumProperty); }
        set { SetValue(MaximumProperty, value); }
    }
    public readonly static DependencyProperty MaximumProperty = DependencyProperty.Register(
        "Maximum", typeof(int), typeof(IntegerTextBox), new UIPropertyMetadata(int.MaxValue));



    public int Minimum
    {
        get { return (int)GetValue(MinimumProperty); }
        set { SetValue(MinimumProperty, value); }
    }
    public readonly static DependencyProperty MinimumProperty = DependencyProperty.Register(
        "Minimum", typeof(int), typeof(IntegerTextBox), new UIPropertyMetadata(int.MinValue));


    public int Value
    {
        get { return (int)GetValue(ValueProperty); }
        set { SetCurrentValue(ValueProperty, value); }
    }
    public readonly static DependencyProperty ValueProperty = DependencyProperty.Register(
        "Value", typeof(int), typeof(IntegerTextBox), new UIPropertyMetadata(0, (o,e)=>
        {
            IntegerTextBox tb = (IntegerTextBox)o;
            tb.RaiseValueChangedEvent(e);
        }));

    public event EventHandler<DependencyPropertyChangedEventArgs> ValueChanged;
    private void RaiseValueChangedEvent(DependencyPropertyChangedEventArgs e)
    {
        ValueChanged?.Invoke(this, e);
    }


    public int Step
    {
        get { return (int)GetValue(StepProperty); }
        set { SetValue(StepProperty, value); }
    }
    public readonly static DependencyProperty StepProperty = DependencyProperty.Register(
        "Step", typeof(int), typeof(IntegerTextBox), new UIPropertyMetadata(1));



    RepeatButton _UpButton;
    RepeatButton _DownButton;
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        _UpButton = Template.FindName("PART_UpButton", this) as RepeatButton;
        _DownButton = Template.FindName("PART_DownButton", this) as RepeatButton;
        _UpButton.Click += btup_Click;
        _DownButton.Click += btdown_Click;
    }


    private void btup_Click(object sender, RoutedEventArgs e)
    {
        if (Value < Maximum)
        {
            Value += Step;
            if (Value > Maximum)
                Value = Maximum;
        }
    }

    private void btdown_Click(object sender, RoutedEventArgs e)
    {
        if (Value > Minimum)
        {
            Value -= Step;
            if (Value < Minimum)
                Value = Minimum;
        }
    }

}

Buradaki en iyi cevap. Bağımlılık özelliklerinin doğru kullanımı.
Konrad

5

Kullanım VerticalScrollBarile TextBlockWPF kontrolü. Arkadaki kodunuza aşağıdaki kodu ekleyin:

Yapıcıda, kaydırma çubuğu için bir olay işleyicisi tanımlayın:

scrollBar1.ValueChanged += new RoutedPropertyChangedEventHandler<double>(scrollBar1_ValueChanged);
scrollBar1.Minimum = 0;
scrollBar1.Maximum = 1;
scrollBar1.SmallChange = 0.1;

Ardından olay işleyicide şunu ekleyin:

void scrollBar1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    FteHolderText.Text = scrollBar1.Value.ToString();
}

İşte kodumdan orijinal pasaj ... gerekli değişiklikleri yapın .. :)

public NewProjectPlan()
{
    InitializeComponent();

    this.Loaded += new RoutedEventHandler(NewProjectPlan_Loaded);

    scrollBar1.ValueChanged += new RoutedPropertyChangedEventHandler<double>(scrollBar1_ValueChanged);
    scrollBar1.Minimum = 0;
    scrollBar1.Maximum = 1;
    scrollBar1.SmallChange = 0.1;

    // etc...
}

void scrollBar1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    FteHolderText.Text = scrollBar1.Value.ToString();
}

1
çözümünüz çok akıllı, ancak düğmeler ters sırada çalışıyor (yukarı düğme değeri azaltırken düğme aşağı değeri artırır). Bu sorunu çözmek için yardımcı olabilecek başka bir ileti dizisi buldum: stackoverflow.com/a/27246296/637968 - kaydırma çubuğunu döndürün
Mike

5

WPFControls kitaplığının bir parçası olarak tarafımdan yazılan WPF için NumericUpDown denetimini kullanabilirsiniz .


Güzel bir kitaplık ve sayısal bir yukarı / aşağı kontrolün nasıl yazılması gerektiğini gösterir. Sahip olduğum tek sorun, demodaki kontroller derlemesine yeniden başvurmak ve nuget'ten MSHTML'yi yüklemek zorunda kalmaktı. Teşekkürler!
sergeantKK

Kütüphanede harika iş çıkardın. Çok kullanışlı. Teşekkürler.
namg_engr

5

9 yıllık soruları cevaplamaya devam ettiğim için özür dile.

@ Micheal'ın cevabını takip ediyorum ve işe yarıyor.

Bunu Controls elemanları gibi sürükleyip bırakabildiğim UserControl olarak yapıyorum. Chevron simgesini ve düğme dalgalanma efektini elde etmek için Nuget'ten MaterialDesign Temasını kullanıyorum.

Değişiklik ile Micheal'dan çalışan NumericUpDown aşağıdaki gibi olacaktır: -

görüntü açıklamasını buraya girin

Kullanıcı kontrolü için kod: -

TemplateNumericUpDown.xaml

<UserControl x:Class="UserControlTemplate.TemplateNumericUpDown"
             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" 
             xmlns:local="clr-namespace:UserControlTemplate"
             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
             mc:Ignorable="d" MinHeight="48">
    <Grid Background="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="60"/>
        </Grid.ColumnDefinitions>
        <TextBox x:Name="txtNum" x:FieldModifier="private" Text="{Binding Path=NumValue}" TextChanged="TxtNum_TextChanged" FontSize="36" BorderThickness="0" VerticalAlignment="Center" Padding="5,0"/>
        <Grid Grid.Column="1">
            <Grid.RowDefinitions>
                <RowDefinition Height="30*"/>
                <RowDefinition Height="30*"/>
            </Grid.RowDefinitions>
            <Grid Background="#FF673AB7">
                <Viewbox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="Auto" Width="Auto">
                    <materialDesign:PackIcon Kind="ChevronUp" Foreground="White" Height="32.941" Width="32"/>
                </Viewbox>
                <Button x:Name="cmdUp" x:FieldModifier="private" Click="CmdUp_Click" Height="Auto" BorderBrush="{x:Null}" Background="{x:Null}"/>
            </Grid>
            <Grid Grid.Row="1" Background="#FF673AB7">
                <Viewbox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="Auto" Width="Auto">
                    <materialDesign:PackIcon Kind="ChevronDown" Foreground="White" Height="32.942" Width="32"/>
                </Viewbox>
                <Button x:Name="cmdDown" x:FieldModifier="private" Click="CmdDown_Click" Height="Auto" BorderBrush="{x:Null}" Background="{x:Null}"/>
            </Grid>
        </Grid>
    </Grid>
</UserControl>

TemplateNumericUpDown.cs

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

namespace UserControlTemplate
{
    /// <summary>
    /// Interaction logic for TemplateNumericUpDown.xaml
    /// </summary>
    public partial class TemplateNumericUpDown : UserControl
    {
        private int _numValue = 0;
        public TemplateNumericUpDown()
        {
            InitializeComponent();
            txtNum.Text = _numValue.ToString();
        }
        public int NumValue
        {
            get { return _numValue; }
            set
            {
                if (value >= 0)
                {
                    _numValue = value;
                    txtNum.Text = value.ToString();
                }
            }
        }

        private void CmdUp_Click(object sender, RoutedEventArgs e)
        {
            NumValue++;
        }

        private void CmdDown_Click(object sender, RoutedEventArgs e)
        {
            NumValue--;
        }

        private void TxtNum_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (txtNum == null)
            {
                return;
            }

            if (!int.TryParse(txtNum.Text, out _numValue))
                txtNum.Text = _numValue.ToString();
        }
    }
}

MyPageDesign.xaml üzerinde, oluşturulan kullanıcı kontrolünü sürükleyip bırakarak <UserControlTemplate:TemplateNumericUpDown HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="100"/>

görüntü açıklamasını buraya girin

Şablondan değeri almak için kullanıyorum

string Value1 = JournalNumStart.NumValue;
string Value2 = JournalNumEnd.NumValue;

Henüz FontSize öğesinden gelen denetimin Yüksekliğini bağlama konusunda yeterli beceriye sahip değilim, bu yüzden kullanıcı denetiminde sayfamdan yazı tipi boyutunu manuel olarak ayarladım.

** Not: - Programımda "Arşiv" adını Arşiv olarak değiştirdim =)


Yukarı / aşağı düğmelerinin kullanılabilirliği korkunç: kullanışlı olamayacak kadar küçükler. Metin kutusuyla EN AZ aynı yükseklikte olmaları (ve kare olmaları) gerekir. Biraz daha fazla yer kapladığını biliyorum, ancak size EN AZ KULLANILABİLİR düğmeleri verir. Aksi takdirde onları eklemek için hiçbir neden yoktur.
Vincent

3

Saf bir çözümüm var ama faydalı. İşte kod:

<Grid Name="TVGrid" Background="#7F000000">  <ScrollBar Background="Black" Orientation="Vertical" Height="35" HorizontalAlignment="Left" Margin="215,254,0,0" Minimum="0" Maximum="10" LargeChange="10" Value="{Binding ElementName=channeltext2, Path=Text}" x:Name="scroll" VerticalAlignment="Top" Width="12" RenderTransformOrigin="0.5,0.5" ValueChanged="scroll_ValueChanged" >  
        <ScrollBar.RenderTransform>  
            <TransformGroup>  
                <ScaleTransform/>  
                <SkewTransform/>  
                <RotateTransform Angle="-180"/>  
                <TranslateTransform/>  
            </TransformGroup>  
        </ScrollBar.RenderTransform>  
    </ScrollBar>  
    <TextBox Name="channeltext" HorizontalContentAlignment="Center" FontSize="20"  Background="Black" Foreground="White" Height="35" HorizontalAlignment="Left" Margin="147,254,0,0" VerticalAlignment="Top" Width="53" Text="0" />  
    <TextBox Name="channeltext2" Visibility="Hidden" HorizontalContentAlignment="Center" FontSize="20"  Background="Black" Foreground="White" Height="35" HorizontalAlignment="Left" Margin="147,254,0,0" VerticalAlignment="Top" Width="53" Text="0" />  </Grid>  


1

Örnek yapmak için sadece pragmatik bir şey:

Senin -Sağ tıklayın Project seçin (Çözüm altında) "Nuget Paketleri Yönetin ..."

-Menüde "wpftoolkit" için Gözat Sekmesine tıklayın , " Extended.Wpf.Toolkit" öğesini seçin

-Yükle!

-Kullanıcı Kontrol Araç Kutunuza sağ tıklayın , "Sekme Ekle" yi seçin ve "WPF Araç Seti" olarak adlandırın

-Yeni "WPF Toolkit" Sekmesine sağ tıklayın, "Öğeleri seç ..." seçeneğini seçin.

-Menü'de "Gözat ..." Düğmesine tıklayın, nugets DLL klasörünü arayın, tümünü seçin " ...\packages\Extended.Wpf.Toolkit.3.5.0\lib\net40\*.dll"

Bazı DLL'ler hakkındaki Uyarıları Yoksay Kullanıcı kontrolleri içermeyebilir!

Hazır :)


0

Projenizin NugetPackage yöneticisine gidin-> MahApps.Metro'ya göz atın ve arayın -> paketi projenize yükleyin. Referansın eklendiğini göreceksiniz: MahApps.Metro. Sonra size XAML kodu ekleyin:

"xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"

Nesnenizi kullanmak istediğiniz yere ekleyin:

<mah:NumericUpDown x:Name="NumericUpDown" ... /> 

Nesnenin tam genişletilebilirliğinin keyfini çıkarın (Bağlamalar, tetikleyiciler vb.).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.