#c# #wpf
#c# #wpf
Вопрос:
Я совершенно новичок в программировании. В настоящее время я пытаюсь создать приложение WPF, которое будет вычислять квадратный корень и т.д. из числа1. У меня проблема с использованием метода, который вычисляет квадратный корень (и не только). Я получил сообщение об ошибке:
Не задан аргумент, соответствующий требуемому формальному параметру «отправитель» MainWindow.RadioBT_Root2_Checked(object, RoutedEventArgs)’
Эта ошибка возникает в RadioBT_Root3_Checked и RadioBT_Root4_Checked, потому что у меня есть 3 метода.
Его код — CS7036. Что я делаю плохо? Я так много искал, но не могу его найти (или я не могу искать).
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 Examples {
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow: Window {
public MainWindow() {
InitializeComponent();
}
double number1;
double number2;
double resu<
private void TXB_1_TextChanged(object sender, TextChangedEventArgs e) {
}
private void TXB_2_TextChanged(object sender, TextChangedEventArgs e) {
}
private void BT_Potegowanie_Click(object sender, RoutedEventArgs e) {
try {
number1 = double.Parse(TXB_1.Text);
number2 = double.Parse(TXB_2.Text);
result = Math.Pow(number1, number2);
MessageBox.Show("WYNIK: " result.ToString());
} catch (Exception) {
MessageBox.Show("Wystąpił błąd.", "Błąd", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
public void BT_Root_Click(object sender, RoutedEventArgs e) {
if (RadioBT_Root2_Checked()) ///CS7036
MessageBox.Show("RESULT: " result.ToString());
if (RadioBT_Root3_Checked()) ///CS7036
MessageBox.Show("RESULT: " result.ToString());
if (RadioBT_Root4_Checked()) ///CS7036
MessageBox.Show("RESULT: " result.ToString());
}
public void RadioBT_Root2_Checked(object sender, RoutedEventArgs e) {
number1 = double.Parse(TXB_1.Text);
result = Math.Sqrt(number1);
}
public void RadioBT_Root3_Checked(object sender, RoutedEventArgs e) {
number1 = double.Parse(TXB_1.Text);
number2 = (1 / 3.0);
result = Math.Pow(number1, number2);
}
public void RadioBT_Root4_Checked(object sender, RoutedEventArgs e) {
number1 = double.Parse(TXB_1.Text);
number2 = (1 / 4.0);
result = Math.Pow(number1, number2);
}
}
}
РЕДАКТИРОВАТЬ: я сделал то, что предложил Эд Планкетт, и теперь у меня другая проблема. Это связано с XAML (я думаю). Я также обнаружил, что мне может понадобиться place ‘?? в некоторых местах false. В списке ошибок указано: ‘MainWindow’ не содержит определения ‘RadioBT_Root4_Checked’ и не удалось найти метод расширения ‘RadioBT_Root4_Checked’, принимающий первый аргумент типа ‘MainWindow’ (вам не хватает директивы using или ссылки на сборку?)
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 Examples
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void TXB_1_TextChanged(object sender, TextChan`enter code here`gedEventArgs e)
{
}
private void TXB_2_TextChanged(object sender, TextChangedEventArgs e)
{
}
public void BT_Root_Click(object sender, RoutedEventArgs e)
{
double number1 = 0;
double number2 = 0;
double result = 0;
if (RadioBT_Root2.IsChecked ?? false) ///CS0266
{
number1 = double.Parse(TXB_1.Text);
result = Math.Sqrt(number1);
}
else if (RadioBT_Root3.IsChecked ?? false) ///CS0266
{
number1 = double.Parse(TXB_1.Text);
number2 = (1 / 3.0);
result = Math.Pow(number1, number2);
}
else if (RadioBT_Root4.IsChecked ?? false) ///CS0266
{
number1 = double.Parse(TXB_1.Text);
number2 = (1 / 4.0);
result = Math.Pow(number1, number2);
}
MessageBox.Show("RESULT: " result.ToString());
}
}
Мой код XAML:
<Window x:Class="Examples.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:Examples"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Label x:Name="label" Content="First numberamp;#xD;amp;#xA;amp;#xA;First number" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,10,0,0" Width="117" Height="31" FontSize="15"/>
<TextBox x:Name="TXB_1" HorizontalAlignment="Left" Height="28" Margin="132,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" FontSize="15" TextChanged="TXB_1_TextChanged"/>
<Label x:Name="label1" Content="Second numberamp;#xD;amp;#xA;amp;#xA;Second numberamp;#xD;amp;#xA;" HorizontalAlignment="Left" Margin="10,46,0,0" VerticalAlignment="Top" Width="117" Height="30" FontSize="15"/>
<TextBox x:Name="TXB_2" HorizontalAlignment="Left" Height="28" Margin="132,48,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" TextChanged="TXB_2_TextChanged" FontSize="15"/>
<Separator HorizontalAlignment="Left" Height="19" Margin="0,69,0,0" VerticalAlignment="Top" Width="517"/>
<Button x:Name="BT_Root" Content="ROOT" HorizontalAlignment="Left" Margin="10,81,0,0" VerticalAlignment="Top" Width="128" Height="48" FontSize="16" Click="BT_Root_Click"/>
<RadioButton x:Name="RadioBT_Root2" Content="Root2" HorizontalAlignment="Left" Margin="143,81,0,0" VerticalAlignment="Top" Checked="RadioBT_Root2_Checked"/>
<RadioButton x:Name="RadioBT_Root3" Content="Root3" HorizontalAlignment="Left" Margin="143,96,0,0" VerticalAlignment="Top" Checked="RadioBT_Root3_Checked"/>
<RadioButton x:Name="RadioBT_Root4" Content="Root4" HorizontalAlignment="Left" Margin="143,111,0,0" VerticalAlignment="Top" Checked="RadioBT_Root4_Checked"/>
</Grid>
</Window>
Я также попытался изменить ‘Checked=»RadioBT_Root4_Checked»/>’ на ‘Checked=»RadioBT_Root4.Проверено «/>’. В нем говорится: «Ошибка проверена =»RadioBT_Root2.IsChecked» недопустимо. ‘RadioBT_Root2.IsChecked’ не является допустимым именем метода обработчика событий. Допустимы только методы экземпляра в сгенерированном или кодовом классе. ‘
Комментарии:
1. Пожалуйста, опубликуйте свой XAML тоже
2. Вы должны остановиться здесь и сначала прочитать и понять книгу о программировании на C #.
Ответ №1:
Вы вызываете свои обработчики событий — например, RadioBT_Root2_Checked
— без параметров, хотя для них требуется два параметра. Вы также действуете так, как будто они «возвращаются» bool
, хотя они ничего не «возвращают».
Что означает «return»? 1 3
ВОЗВРАТ 4
:
int x = 1 3;
Теперь x
равно 4.
Функции могут возвращать значения:
public bool GreaterThan(int x, int y) { return x > y; }
Используйте его следующим образом:
if (GreaterThan(10, 9))
{
MessageBox.Show("10 is greater than 9");
}
Но я думаю, что вы действительно не хотите вызывать эти методы. Я думаю, это то, что вы хотите:
Я думаю, вы хотите узнать, какой флажок пользователь нажал, а затем показать этот результат. Результаты вычисляются при установке флажков; эти функции являются обработчиками событий. Чтобы узнать, установлен ли каждый флажок, посмотрите на объект checkbox — используя имя, которое вы ему дали, — и посмотрите на его IsChecked
свойство.
Вот так:
public void BT_Root_Click(object sender, RoutedEventArgs e)
{
if (RadioBT_Root2.IsChecked)
MessageBox.Show("RESULT: " result.ToString());
else if (RadioBT_Root3.IsChecked)
MessageBox.Show("RESULT: " result.ToString());
else if (RadioBT_Root4.IsChecked)
MessageBox.Show("RESULT: " result.ToString());
}
Кроме того, посмотрите на эти операторы if: все три делают одно и то же. Вы можете упростить дальше:
public void BT_Root_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("RESULT: " result.ToString());
}
Но вот лучший способ:
public void BT_Root_Click(object sender, RoutedEventArgs e)
{
double number1 = 0;
double number2 = 0;
double result = 0;
if (RadioBT_Root2.IsChecked)
{
number1 = double.Parse(TXB_1.Text);
result = Math.Sqrt(number1);
}
else if (RadioBT_Root3.IsChecked)
{
number1 = double.Parse(TXB_1.Text);
number2 = (1 / 3.0);
result = Math.Pow(number1, number2);
}
else if (RadioBT_Root4.IsChecked)
{
number1 = double.Parse(TXB_1.Text);
number2 = (1 / 4.0);
result = Math.Pow(number1, number2);
}
MessageBox.Show("RESULT: " result.ToString());
}
Вам не нужно result
, number
, и number2
быть членами класса, и вам вообще не нужны эти *_Checked
обработчики событий.