Создание конвектора системы счисления на С# на WPF
Пишу первый раз программу. Помогите с объяснением обработчиков событий для ComboBox.
<Window x:Class="LAB2SVPPTASK2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LAB2SVPPTASK2"
mc:Ignorable="d"
Title="Конвектор" Height="150" Width="200">
<Grid>
<ComboBox Name="comboBox" HorizontalAlignment="Center" Margin="0,51,0,0" VerticalAlignment="Top" Width="120" SelectionChanged="ComboBox_SelectionChanged">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
<ComboBoxItem Content="Десятичное в двоичное" />
<ComboBoxItem Content="Десятичное в троичное" />
<ComboBoxItem Content="Десятичное в пятеричное" />
<ComboBoxItem Content="Десятичное в восьмеричное" />
<ComboBoxItem Content="Десятичное в шестнадцатеричное"/>
</ComboBox>
<TextBlock HorizontalAlignment="Center" Margin="0,15,0,0" TextWrapping="Wrap" Text="Выберите операцию" VerticalAlignment="Top" Height="24" Width="148"/>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace LAB2SVPPTASK2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
InitializeComboBox();
}
private void InitializeComboBox()
{
// Initialize ComboBox with base numbers from 2 to 16
for (int i = 2; i <= 16; i++)
{
ComboBoxItem item = new ComboBoxItem();
item.Content = $"{i}";
item.Tag = i;
ComboBox.Items.Add(item);
}
}
private void ComboBox_SelectionChanged(object sender, RoutedEventArgs e, TextBox textBox)
{
// Get the selected base number from ComboBox
ComboBoxItem selectedItem = (ComboBoxItem)ComboBox.SelectedItem;
int targetBase = (int)selectedItem.Tag;
// Get the number to be converted from TextBox
string number = textBox.Text;
// Convert the number from the source base to the target base
string convertedNumber = ConvertNumber(number, 10, targetBase);
// Show the converted number in a MessageBox
MessageBox.Show($"Converted number: {convertedNumber}");
}
private string ConvertNumber(string number, int sourceBase, int targetBase)
{
// Convert the number from the source base to the target base
int decimalValue = Convert.ToInt32(number, sourceBase);
string result = Convert.ToString(decimalValue, targetBase);
return result;
}
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
}
Ответы (1 шт):
Начать нужно отсюда: Практическое руководство. Добавление обработчика событий (WPF .NET)
Обработчик события имеет вид void <имя_обработчика>(object, event_arg)
и не знает ничего об аргументе TextBox textBox
В Вашем коде, при выборе элемента в ComboBox, сработает вызов обработчика событий private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
, который у Вас не содержит инструкций.
Получение конвертированного значения следует обернуть в try...catch
или почитать документацию на Convert.ToString (short value, int toBase)
, в которой указано
Исключения
ArgumentException
toBase не равно 2, 8, 10 или 16.
т.е. два варианта преобразования гарантированно приведут к выбрасыванию исключения и Ваша программа будет аварийно завершена.
Если Вы плохо представляете, как работают циклы и что в результате окажется в коллекции элементов ComboBox, необходимо глубже изучить этот раздел, а пока - избавиться от конструкции
for (int i = 2; i <= 16; i++)
{
ComboBoxItem item = new ComboBoxItem();
item.Content = $"{i}";
item.Tag = i;
ComboBox.Items.Add(item);
}
и задать значения вручную
<ComboBoxItem Content="Десятичное в двоичное" Tag="2"/>
<ComboBoxItem Content="Десятичное в троичное" Tag="3"/>
<ComboBoxItem Content="Десятичное в пятеричное" Tag="5"/>
<ComboBoxItem Content="Десятичное в восьмеричное" Tag="8"/>
<ComboBoxItem Content="Десятичное в шестнадцатеричное" Tag="16"/>
Если уж так не хочется придерживаться общепринятого подхода WPF:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.3*"/>
<ColumnDefinition Width="0.4*"/>
<ColumnDefinition Width="0.3*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="1" HorizontalAlignment="Center" TextWrapping="Wrap" Text="Выберите операцию" VerticalAlignment="Top" Height="24" />
<ComboBox Name="cbxCombo" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Top" SelectionChanged="comboBox_SelectionChanged">
<ComboBoxItem Content="Десятичное в двоичное" Tag="2"/>
<ComboBoxItem Content="Десятичное в троичное" Tag="3"/>
<ComboBoxItem Content="Десятичное в пятеричное" Tag="5"/>
<ComboBoxItem Content="Десятичное в восьмеричное" Tag="8"/>
<ComboBoxItem Content="Десятичное в шестнадцатеричное" Tag="16"/>
</ComboBox>
<TextBox Name="tbxSource" Grid.Row="1" Grid.Column="0" Text="Число для преобразования" />
<TextBlock Name="tbResult" Grid.Row="1" Grid.Column="2" Text="Результат" />
<TextBlock Name="tbError" Grid.Row="2" Grid.Column="1" TextWrapping="Wrap" HorizontalAlignment="Center" Margin="0 30" Text=""/>
</Grid>
using System.Windows;
using System.Windows.Controls;
namespace WpfApp1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
tbError.Text = "";
// Get the selected base number from ComboBox
ComboBoxItem selectedItem = (ComboBoxItem)((ComboBox)sender).SelectedItem;
if (!int.TryParse(selectedItem.Tag.ToString(), out int targetBase))
return;
try
{
tbResult.Text = ConvertNumber(tbxSource.Text, 10, targetBase); ;
}
catch (Exception ex)
{
tbError.Text = "Произошла ошибка: " + ex.Message;
}
}
private string ConvertNumber(string number, int sourceBase, int targetBase)
{
// Convert the number from the source base to the target base
int decimalValue = Convert.ToInt32(number, sourceBase);
string result = Convert.ToString(decimalValue, targetBase);
return result;
}
}
}