Ahoj, pokouším se přidat if-statement do okna xaml.cs s požití podmínky
na radiobutton z jiného xaml okna. Všude jsem to hledal i se dotazoval na
zahraničních webech ale vždy stejná odpověď, a to, ať to předělám do
MVVM ale já bych byl rád kdybych nemusel.
Zkusil jsem:
if (scitani.IsChecked.HasValue && scitani.IsChecked.Value)
{
znamenko.Text = "+";
}
scitani je radiobutton z jiného xaml.
Chci docílit: Tak se ptám, zda někdo neví o nějakém jednoduchém
řešení, jak to vyřešit? zda nějak odkázat a nebo vytvořit metodu v
xaml.cs, kde se daný radiobutton vyskytuje.
na to co chceš si musíš někde sehnat handle toho okna kde je ten prvek
scitani... chňápeš jo ?
máš několik možností .. předat ho do konstruktoru nebo si vytvořit
globální třídu se static construktorem a static proměnnýma, kam to
uložíš ... nebo handle předáš až po vytvoření oběktu MainWindow
no to sis přeci musel zvolit když sis ten projekt zakládal ne ?
jestli máš poslední verzi Visual Studia tak tam je typ .NET core což je
nová verze
a .NET framework cože je stará verze ...
a navíc u .NET core si volíš podverzi čili .NET core 3.0 nebo 3.1 nebo
nejnovější doporučovanou .NET5/6...
a navíc se to píše v konfiguračním souboru tvé aplikace
tady je příklad https://uloz.to/…/wpfapp3-zip
ke sdílenému RadioButtonu se musí v XAML přidělit vlastnost
x:FieldModifier="public"
předávat tu referenci mužeš vícero způsoby - constructorem, po
inicializaci (to je udělaný v příkladu), přes .Cast<Window>(). atd
atd...
a tady sou vysvětlení:
abych nezapomněl .. jestli chceš dělat programátora tak základní
podmínkou je prfektní angličtina
bez AJ si neškrtneš .. všechny manuály jsou dneska jen v AJ
měnit controls z jednoho okna do druhého není "standardní postup" ...
a navíc sis vybral knihovnu .NET5/6 WPF (z roku 2008), která je ... poněkud
výrazně složitější než
.NET 5/6 WinForms (z roku 2001) ... ale zato ji vyžaduje jako pracovní znalost
větší množství zaměstnavatelů...
učit se v dnešní době obě už asi nemá smysl ...
přiznám se že nechápu co děláš za "divnou" aplikaci ale .. možná by
se všechno vešlo do jedný aplikace
a okna by sis udělal na TabControls pomocí UserControl v jednom projektu
...
snažím se vytvořit "matematickou hru" kde si v prvním okně vybereš,
jakou početní operaci chceš(sčítání, odčítání, násobení) dále si
zvolíš, jakou chceš úroveň, zda lehčí čí těžší (lehčí dá
možnosti výsledku, těžší musíš vypočítat sám) pak jdeš k samotné
hře, kde máš čas a životy, po vypršení času naběhne průměrný čas na
příklad, který se zapíše do tabulky
pokouším se to ještě dodělat v původní verzi lae nyní mám problém s
tímto:
privatevoid Window_Loaded(object sender, RoutedEventArgs e)
{
MainWindow window1 = Application.Current.Windows.OfType<MainWindow>().First();
var scitani = window1.scitani ;
var odcitani = window1.odcitani;
var nasobeni = window1.nasobeni;
vysledekhrac.Focus();
suma++;
pocetprikladu.Text = suma.ToString();
mt.Start();
timer.Value = 0;
posunTimer.Start();
Random prvni = new Random();
Random druhy = new Random();
int maxprvni = 10;
int maxdruhy = 10;
int prvnic = prvni.Next(1, maxprvni);
int druhyc = druhy.Next(2, maxdruhy);
if (scitani.IsChecked.HasValue) && scitani.IsChecked.Value)
{
znamenko.Text = "+";
}
if (odcitani.IsChecked.HasValue && odcitani.IsChecked.Value)
{
znamenko.Text = "-";
}
if (nasobeni.IsChecked.HasValue && nasobeni.IsChecked.Value)
{
znamenko.Text = "*";
}
if (znamenko.Text=="+")
{
int total = (prvnic+druhyc);
prvnit.Text = prvnic.ToString();
druhyt.Text = druhyc.ToString();
vysledek.Text = total.ToString();
}
if (znamenko.Text == "-")
{
int total = (prvnic - druhyc);
prvnit.Text = prvnic.ToString();
druhyt.Text = druhyc.ToString();
vysledek.Text = total.ToString();
}
if (znamenko.Text == "*")
{
int total = (prvnic * druhyc);
prvnit.Text = prvnic.ToString();
druhyt.Text = druhyc.ToString();
vysledek.Text = total.ToString();
}
}
všechny tři možnosti jsou stejné:
if (scitani.IsChecked.HasValue) && scitani.IsChecked.Value)
{
znamenko.Text = "+";
}
if (odcitani.IsChecked.HasValue && odcitani.IsChecked.Value)
{
znamenko.Text = "-";
}
if (nasobeni.IsChecked.HasValue && nasobeni.IsChecked.Value)
{
znamenko.Text = "*";
}
ale neuzná mi to jen první a když ji odstraním abych to zkusil bez toho
tak mi to hodí chybu:
Program neobsahuje statickou metodu Main vhodnou pro vstupní bod.
hm asi ještě chvíli potrvá než to dáš dohromady ... hele ty se asi
učíš z manuálů na internetu co ?
neměl by si používat výrazy typu
if (odcitani.IsChecked.HasValue && odcitani.IsChecked.Value)
ale měl bys psát
if (odcitani.IsChecked.HasValue == true &&
odcitani.IsChecked.Value == true)
jinak tvuj program v .NET5/6 WPF musí obsahovat vstupní bod což je
toto:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
z tohoto vsupního bodu pak voláš další funkce...
není dobré zapisovat tvuj algoritmus do funkce
private void Window_Loaded(object sender, RoutedEventArgs e)
protože ta se volýá pokaždé když se např. tvuj pc probouzí z režimu
spánku a pod..
takže je taky možný že něco voláš dvakrát po sobě a pak je v tom
chaos
místo tristate-checkboxu mužeš zvolit combobox se 3 možnostma...
jestli to dobře chápu tak scitani je checkbox ..
co myslíš tim "vypsat" ????
dotaz na stav musí bt u každého zvlášť nebo se to dá dělat cyklem for,
ale pak musíš někam do Listu<Checkbox> uložit handle těch checkboxů
...
a ještě dotaz: jde udělat to, aby když uživatel odklikne ty
radiobuttony( první na matematickou operaci a druhý na zvolenou obtížnost)
aby poslali do vedlejší třídy, informace(hodnoty), že byly zvolený zrovna
ty radiobuttony, a z té třídy se to dále zpracovalo do xaml.cs? Asi to
vysvětluji blbě ale snad je to trochu k pochopení...
jo to de ...
opět potřebuješ mít aktivní tu třídu kam to posíláš ty zprávy a
samozřejmě znát její handle ...
když nemáš RadioButton 3 stavovej tak se nemušíš ptát na
scitani.IsChecked.HasValue ... chápeš jo ?
prostě hned za řádek
InitializeComponent();
dáš
scitani.IsChecked = true;
třídu si musíš vytvořit příkazem new "třeba MOJE" a pak uchovat její
handle a ve třídě si vytvoříš nějakou asi "public void SENDIT" metodu
kterou pak zavoláš a předáš ji potřebný informace ... takže
moje.sendit(parametrA, parametrB) a ta metoda už pak něco udělá ..
eště drobnost ta glonálníá statická třída se vytvoří tak že si
přidáš třídu t.j. z projectExplorer / Add / Class
s obsahem:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WpfApp
{
public static class Class1
{
public static String value = "";
static Class1()
{
}// static Class1()
}// public static class Class1
}
a value pak je viditelná odkudkoliv .. nezapomeň že nejprve se
inicializujou konstruktory jednotlivých xaml formulářů takže naplnit
hodnotou mužeš value až po inicializaci .. t.j. až po volání metody
Form_Load ...
nešlo by to řešit přes enumerátory, že bych nastavil scitaniNiz,
scitaniVys,
odcitaniNiz,
odcitaniVys,
nasobeniNiz,
nasobeniVys,
deleniNiz,
deleniVys,
Vys,Niz- podle obtížnosti
a podle toho pak řídil v konečném xaml.cs?
já se přiznám že teď se už v tom tvým programu vubec neorientuju
nevim .. asi jo .. ale v tom poli (asi List<Object>. nebo
Array<Object>) co chceš enumerovat
budeš muset mít seznam těch tříd ...
a taková drobnost .. microsoftu se nepovedla aktualizace MS VS 16.9.4 ...
nefunguje
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.