Связь ComboBox и TextBox в WPF

208
19 марта 2018, 22:47

Есть ComboBox и несколько TextBox:

<ComboBox SelectedIndex="0" Padding="2" FontSize="18">
        <ComboBoxItem>1</ComboBoxItem>
        <ComboBoxItem>2</ComboBoxItem>
    </ComboBox>
//Первый Grid
<Grid Grid.Column="0" Grid.Row="1" Margin="47 0 47 50">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <TextBox Grid.Column="0" Grid.Row="0" Padding="3" Margin="2" FontSize="15" Name="Cell1" TextAlignment="Center"/>
    <TextBox Grid.Column="0" Grid.Row="1" Padding="3" Margin="2" FontSize="15" Name="Cell2" TextAlignment="Center"/>
    <TextBox Grid.Column="1" Grid.Row="0" Padding="3" Margin="2" FontSize="15" Name="Cell3" TextAlignment="Center"/>
    <TextBox Grid.Column="1" Grid.Row="1" Padding="3" Margin="2" FontSize="15" Name="Cell3" TextAlignment="Center"/>
</Grid>
//Второй Grid
<Grid Grid.Column="0" Grid.Row="1" Margin="47 0 47 50">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <!--First Colomn-->
    <TextBox Grid.Column="0" Grid.Row="0" Padding="3" Margin="2" FontSize="15" Name="Cell1" TextAlignment="Center"/>
    <TextBox Grid.Column="0" Grid.Row="1" Padding="3" Margin="2" FontSize="15" Name="Cell2" TextAlignment="Center"/>
    <TextBox Grid.Column="0" Grid.Row="2" Padding="3" Margin="2" FontSize="15" Name="Cell3" TextAlignment="Center"/>
    <!--Second Colomn-->
    <TextBox Grid.Column="1" Grid.Row="0" Padding="3" Margin="2" FontSize="15" Name="Cell4" TextAlignment="Center"/>
    <TextBox Grid.Column="1" Grid.Row="1" Padding="3" Margin="2" FontSize="15" Name="Cell5" TextAlignment="Center"/>
    <TextBox Grid.Column="1" Grid.Row="2" Padding="3" Margin="2" FontSize="15" Name="Cell6" TextAlignment="Center"/>
</Grid>

Вопросы:

  • Изменения шрифта в зависимости от размера окна. Изначально установлено, что шрифт 15, нужно сделать так, чтобы при MaxWidth и MaxHeight он был 20, а при MinWidth и MinHeigh был 10 и менялся в этом диапазоне в зависимости от размера окна

  • Реализовать заполнение TextBox через пробел. При запуске окна, после InitializeComponent(); есть Cell1.Focus();. Нужно, чтобы при нажатии на кнопку пробел курсор перемещался из одного TextBox в другой (Cell1.Focus(); -> Cell2.Focus(); -> Cell3.Focus();)

  • Зависимость ComboBox от количества TextBox. Есть Первый Grid и Второй Grid. Нужно, чтобы при выборе ComboBoxItem == 1, на странице был первый Grid, а при выборе ComboBoxItem == 2, на странице был второй Grid. Всё это динамически меняется при выборе ComboBoxItem

Answer 1

Давайте покажу, как менять шрифт глобально.

Вам нужно не выставлять шрифт конкретному элементу, а определить его на уровне окна. Для привязки нам понадобится пара простых конвертеров:

class RatioConverter : IValueConverter
{
    public double Min { get; set; }
    public double Max { get; set; }
    public double MinValue { get; set; }
    public double MaxValue { get; set; }
    public object Convert(object value, Type targetType, object p, CultureInfo ci)
    {
        double v = (double)value;
        var ratio = (v - Min) / (Max - Min);
        return MinValue + (MaxValue - MinValue) * ratio;
    }
    public object ConvertBack(object value, Type targetType, object p, CultureInfo ci) =>
        throw new NotSupportedException();
}
class MinConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object p, CultureInfo ci) =>
        values.Cast<double>().Min();
    public object[] ConvertBack(object value, Type[] targetTypes, object p, CultureInfo ci)=>
        throw new NotSupportedException();
}

Теперь сам XAML.

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:Test"
        Title="Тест" Height="200" Width="300">
    <Window.Resources>
        <sys:Double x:Key="MinWidth">200</sys:Double>
        <sys:Double x:Key="MaxWidth">400</sys:Double>
        <sys:Double x:Key="MinHeight">150</sys:Double>
        <sys:Double x:Key="MaxHeight">300</sys:Double>
        <sys:Double x:Key="MinFontSize">15</sys:Double>
        <sys:Double x:Key="MaxFontSize">40</sys:Double>
        <local:RatioConverter
            x:Key="WidthConverter"
            MinValue="{StaticResource MinFontSize}" MaxValue="{StaticResource MaxFontSize}"
            Min="{StaticResource MinWidth}" Max="{StaticResource MaxWidth}"/>
        <local:RatioConverter
            x:Key="HeightConverter"
            MinValue="{StaticResource MinFontSize}" MaxValue="{StaticResource MaxFontSize}"
            Min="{StaticResource MinHeight}" Max="{StaticResource MaxHeight}"/>
        <local:MinConverter x:Key="MinConverter"/>
    </Window.Resources>
    <TextBlock.FontSize>
        <MultiBinding Converter="{StaticResource MinConverter}">
            <Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"
                     Converter="{StaticResource WidthConverter}"/>
            <Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"
                     Converter="{StaticResource HeightConverter}"/>
        </MultiBinding>
    </TextBlock.FontSize>
    <Window.MinWidth><StaticResource ResourceKey="MinWidth"/></Window.MinWidth>
    <Window.MaxWidth><StaticResource ResourceKey="MaxWidth"/></Window.MaxWidth>
    <Window.MinHeight><StaticResource ResourceKey="MinHeight"/></Window.MinHeight>
    <Window.MaxHeight><StaticResource ResourceKey="MaxHeight"/></Window.MaxHeight>
    <Grid>
        <TextBlock Text="Здравствуй, мир!"
                   HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>

Получается:

READ ALSO
PlayerPrefs не сохраняет структуру

PlayerPrefs не сохраняет структуру

Ломаю голову не могу понять в чем дело , почему структура выдает везде Null а остальное сохраняется !

228
Как сделать свой ключ для шифровки DES?

Как сделать свой ключ для шифровки DES?

Как сделать свой ключ для шифровки DES на C#?

164
ComputerInfo.OSFullName

ComputerInfo.OSFullName

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

186