• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kalkulator WPF - objawy jakby się nie odświeżał

Object Storage Arubacloud
+1 głos
573 wizyt
pytanie zadane 9 grudnia 2021 w C# przez Bodziek96 Nowicjusz (150 p.)

Heeejka, próbuje sobie jakoś skleić kalkulator w WPF, ale natrafiłem na problem którego nie mogę rozwiązać, mam wrażenie że tak jakby okno MainWindow nie odswieżało się. W TextBoxie po odpaleniu aplikacji wyświetla się zawartość, którą wczesniej wpisałem na potrzeby testu. Teraz zawartość do wyświetlenia w tym oknie jest już inna, a wyświetla się dalej ta sama, stara. 

Ja już nie mam na to pomysłu, więc bardzo proszę o pomoc.

 

komentarz 9 grudnia 2021 przez Siemił Mądrala (7,380 p.)
nie za bardzo rozumiem o co ci chodzi. W jaki sposób się nie odświeża. Co robisz? Nie wyświetla "Sprawdzam sobie coś"?
komentarz 9 grudnia 2021 przez Bodziek96 Nowicjusz (150 p.)
dokładnie tak. Powinno się wyświetlić teraz "Sprawdzam sobie coś", a wyświetla sie treść która była  wpisana w TextBox.Text wcześniej. Program uruchamiałem już ze 100 razy na nowo - nie pomogło, tak samo jak wyłącznie i włącznie visual studio.
komentarz 9 grudnia 2021 przez Siemił Mądrala (7,380 p.)
Bym musiał twój kod obejrzeć bo z tych fragmętów to cięzko coś wywnioskować.Gybyś mugł za pomocą bloczka kodu wkleić to co masz w xamlu i cs?
komentarz 9 grudnia 2021 przez Bodziek96 Nowicjusz (150 p.)

Po odpaleniu tego kodu mam taki komunikat: "342342342342BODSIO"

 

<Window x:Class="Kalku_działa.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:Kalku_działa"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <TextBox x:Name="TextBox" Grid.Row="0" Grid.Column="0"  Grid.ColumnSpan="5"/>
        <Button x:Name="Button7" Click="Button_Click" Grid.Row="1" Content="7"/>
        <Button x:Name="Button4" Click="Button_Click" Grid.Row="2" Content="4"/>
        <Button x:Name="Button1" Click="Button_Click" Grid.Row="3" Content="1"/>
        <Button x:Name="Button0" Click="Button0_Click" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Content="0"/>


        <Button x:Name="Button2" Click="Button_Click" Grid.Row="3" Grid.Column="1" Content="2"/>
        <Button x:Name="Button5" Click="Button_Click" Grid.Row="2" Grid.Column="1" Content="5"/>
        <Button x:Name="Button8" Click="Button_Click" Grid.Row="1" Grid.Column="1" Content="8"/>

        <Button x:Name="Button9" Click="Button_Click" Grid.Row="1" Grid.Column="2" Content="9"/>
        <Button x:Name="Button6" Click="Button_Click" Grid.Row="2" Grid.Column="2" Content="6"/>
        <Button x:Name="Button3" Click="Button_Click" Grid.Row="3" Grid.Column="2" Content="3"/>
        <Button x:Name="ButtonDot" Click="ButtonDot_Click" Grid.Row="4" Grid.Column="2" Content="."/>

        <Button x:Name="ButtonDivide" Click="ButtonDivide_Click" Grid.Row="1" Grid.Column="3" Content="/"/>
        <Button x:Name="ButtonMinus" Click="ButtonMinus_Click" Grid.Row="2" Grid.Column="3" Content="-"/>
        <Button x:Name="ButtonMultiply" Click="ButtonMultiply_Click" Grid.Row="3" Grid.Column="3" Content="*"/>
        <Button x:Name="ButtonClear" Click="ButtonClear_Click" Grid.Row="4" Grid.Column="3" Content="C"/>

        <Button x:Name="ButtonPlus" Click="ButtonPlus_Click" Grid.Row="1" Grid.Column="4" Grid.RowSpan="2" Content="+"/>
        <Button x:Name="ButtonEqual" Click="ButtonEqual_Click" Grid.Row="3" Grid.Column="4" Grid.RowSpan="2" Content="="/>




    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.ComponentModel;
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 Kalku_działa
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            TextBox.Text = "Sprawdzam sobie coś";
        }
       

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var button = sender as Button;
            var currentNumber = button.Name[6];

            TextBox.Text += currentNumber;
        }

        private void ButtonDot_Click(object sender, RoutedEventArgs e)
        {
            TextBox.Text += ".";
        }

        private void ButtonDivide_Click(object sender, RoutedEventArgs e)
        {
            TextBox.Text += "/";
        }

        private void ButtonMinus_Click(object sender, RoutedEventArgs e)
        {
            TextBox.Text += "-";
        }

        private void ButtonMultiply_Click(object sender, RoutedEventArgs e)
        {
            TextBox.Text += "*";
        }

        private void ButtonClear_Click(object sender, RoutedEventArgs e)
        {
            TextBox.Text = string.Empty;
        }

        private void ButtonPlus_Click(object sender, RoutedEventArgs e)
        {
            TextBox.Text += "+";
        }

        private void ButtonEqual_Click(object sender, RoutedEventArgs e)
        {
            var operation = TextBox.Text;
            var addElements = operation.Split('+');

        }
    }    
}

 

1 odpowiedź

0 głosów
odpowiedź 9 grudnia 2021 przez areklipno Stary wyjadacz (11,930 p.)

Wg mnie nie masz zaimplementowanego interfejsu: INotifyPropertyChanged na klasie, która Ci wyświetla....

Po każdej zmianie wyświetlanej/zbindowanej właściwości musisz uruchomić zdarzenie OnPropertyChanged. Wtedy obraz się odświeży jak trzeba.

Przykładowy fragment kodu, który na pewno będzie działał jako ViewModel:

public class MyViewModel : INotifyPropertyChanged
    {
        string TekstToPokazaniaLocal;
        public string TekstToPokazania
        {
            get => TekstToPokazaniaLocal;
            set
            {
                TekstToPokazaniaLocal = value;
                OnPropertyChanged("TekstToPokazania");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }

 

komentarz 9 grudnia 2021 przez Bodziek96 Nowicjusz (150 p.)
using System;
using System.Collections.Generic;
using System.ComponentModel;
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 Kalku_działa
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            TextBox.Text = "Sprawdzam sobie coś";
        }
       

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var button = sender as Button;
            var currentNumber = button.Name[6];

            TextBox.Text += currentNumber;
        }

        private void ButtonDot_Click(object sender, RoutedEventArgs e)
        {
            TextBox.Text += ".";
        }

        private void ButtonDivide_Click(object sender, RoutedEventArgs e)
        {
            TextBox.Text += "/";
        }

        private void ButtonMinus_Click(object sender, RoutedEventArgs e)
        {
            TextBox.Text += "-";
        }

        private void ButtonMultiply_Click(object sender, RoutedEventArgs e)
        {
            TextBox.Text += "*";
        }

        private void ButtonClear_Click(object sender, RoutedEventArgs e)
        {
            TextBox.Text = string.Empty;
        }

        private void ButtonPlus_Click(object sender, RoutedEventArgs e)
        {
            TextBox.Text += "+";
        }

        private void ButtonEqual_Click(object sender, RoutedEventArgs e)
        {
            var operation = TextBox.Text;
            var addElements = operation.Split('+');

        }
    }    
}
<Window x:Class="Kalku_działa.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:Kalku_działa"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <TextBox x:Name="TextBox" Grid.Row="0" Grid.Column="0"  Grid.ColumnSpan="5"/>
        <Button x:Name="Button7" Click="Button_Click" Grid.Row="1" Content="7"/>
        <Button x:Name="Button4" Click="Button_Click" Grid.Row="2" Content="4"/>
        <Button x:Name="Button1" Click="Button_Click" Grid.Row="3" Content="1"/>
        <Button x:Name="Button0" Click="Button0_Click" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Content="0"/>


        <Button x:Name="Button2" Click="Button_Click" Grid.Row="3" Grid.Column="1" Content="2"/>
        <Button x:Name="Button5" Click="Button_Click" Grid.Row="2" Grid.Column="1" Content="5"/>
        <Button x:Name="Button8" Click="Button_Click" Grid.Row="1" Grid.Column="1" Content="8"/>

        <Button x:Name="Button9" Click="Button_Click" Grid.Row="1" Grid.Column="2" Content="9"/>
        <Button x:Name="Button6" Click="Button_Click" Grid.Row="2" Grid.Column="2" Content="6"/>
        <Button x:Name="Button3" Click="Button_Click" Grid.Row="3" Grid.Column="2" Content="3"/>
        <Button x:Name="ButtonDot" Click="ButtonDot_Click" Grid.Row="4" Grid.Column="2" Content="."/>

        <Button x:Name="ButtonDivide" Click="ButtonDivide_Click" Grid.Row="1" Grid.Column="3" Content="/"/>
        <Button x:Name="ButtonMinus" Click="ButtonMinus_Click" Grid.Row="2" Grid.Column="3" Content="-"/>
        <Button x:Name="ButtonMultiply" Click="ButtonMultiply_Click" Grid.Row="3" Grid.Column="3" Content="*"/>
        <Button x:Name="ButtonClear" Click="ButtonClear_Click" Grid.Row="4" Grid.Column="3" Content="C"/>

        <Button x:Name="ButtonPlus" Click="ButtonPlus_Click" Grid.Row="1" Grid.Column="4" Grid.RowSpan="2" Content="+"/>
        <Button x:Name="ButtonEqual" Click="ButtonEqual_Click" Grid.Row="3" Grid.Column="4" Grid.RowSpan="2" Content="="/>




    </Grid>
</Window>

komentarz 10 grudnia 2021 przez areklipno Stary wyjadacz (11,930 p.)

Wg mnie musiałbyś poprawić na coś takiego:

- w widoku

<TextBox x:Name="TextBox" Grid.Row="0" Grid.Column="0"  Grid.ColumnSpan="5"
Text="{Binding TextBoxTextToShow, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"

/>

- w kodzie

public partial class MainWindow : Window, INotifyPropertyChanged 
{

public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}

private string TextBoxTextToShowLocal
public string TextBoxTextToShow
        {
            get => TextBoxTextToShowLocal;
            set
            {
                TextBoxTextToShowLocal= value;
                OnPropertyChanged("TextBoxTextToShow");
            }
        }

......
////
private void Button_Click(object sender, RoutedEventArgs e)
        {
            var button = sender as Button;
            var currentNumber = button.Name[6];
 
            TextBoxTextToShow += currentNumber;
        }

}

Wpisałem tylko jedną Twoją funkcję - reszta będzie przez analogię. Teraz powinno działać.

Ogółem dobrze byłoby, gdybyś poczytał jeszcze o interfejsie ICommand, bindowaniu i o ViewModel. W dłuższej perspektywie ułatwia życie.

komentarz 10 grudnia 2021 przez DarthMazut Bywalec (2,990 p.)
Ale brednie... TextBox.Text jest DependencyProperty, jego zmiana jest od razu odzwierciedlana w UI. Pomysł, żeby początkującego od razu odsyłać do MVVM jest śmieszny. Inna sprawa, że powyższa implementacja INPC wywołuje PropertyChanged, nawet jeśli wartość nie zmieniła się, co gorsza nie napisałeś, żeby ustawić DataContext widoku na ViewModel, ciekawe jak długo początkujący by szukał tego buga. Co należałoby odradzić to pobieranie wartości wciśniętego przycisku poprzez Name[6]. Można np. wykorzystać tu property Tag...
komentarz 12 grudnia 2021 przez areklipno Stary wyjadacz (11,930 p.)
@DarthMazut wg Ciebie może może przejście początkującego na MVVM jest śmieszne, ale jak zaczynałem z WPFem miałem te sam problem z odświeżaniem. Zacząłem go stosować i problemy zniknęły.

Z ustawieniem jako DataContext - przeoczyłem, moja wina - odpowiedź pisałem na szybko.

Podobne pytania

+3 głosów
2 odpowiedzi 754 wizyt
pytanie zadane 14 grudnia 2015 w C# przez Walek Nowicjusz (150 p.)
0 głosów
1 odpowiedź 714 wizyt
pytanie zadane 1 września 2016 w C# przez niezalogowany
0 głosów
1 odpowiedź 933 wizyt
pytanie zadane 5 lutego 2021 w C# przez SzymonSmith Użytkownik (870 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...