Diskuze: Jak přidám referenci na radiobutton z jiného xaml okna?
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 48 zpráv z 48.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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
konstuktor ??? pro Radiobutton ?? ten je přeci v knihovně .NET ne ? ten už
znova neuděláš ... chápeš jo ?
děláš to v čem ???
MS VS 2019 C# .NET 4.7.2 WPF ???
MS VS 2019 C# .NET 4.7.2 WinForms ???
MS VS 2019 C# .NET 5/6 WPF ???
MS VS 2019 C# .NET 5/6 WinForms ???
v čem to děláš ???
radši se zeptám než psát nějakou kravinu, kde zjistím jaká je to WPF aplikace?
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
ano volil, proto se ptám, kde to zjistím nyní je to WPF aplikace a mám .NET core
3.1
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í:
https://stackoverflow.com/…ss-or-window
https://stackoverflow.com/…fier-in-code
s angličtinou trochu bojuju normální mluvená je v pohodě ale ta počítačová mi přijde jak
kdybych se učil jiný jazyk
zkoušel jsem to přes to Cast<> jak je i na stackoverflow.... ale to mi nějak hapruje
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
tady je příklad
https://drive.google.com/…PRCxpu7/view?…
duležitý sou řádky
xmlns:controls="clr-namespace:WpfApp"
a
<controls:UserControl1/>
pokouším se to ještě dodělat v původní verzi lae nyní mám problém s tímto:
private void 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.
Nevíš co to může být za chybu?
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
ano jedu podle internetu, já to v ve vstupním okně mám:
using System.Windows;
namespace MathGame
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (scitani.IsChecked.HasValue && scitani.IsChecked.Value)
{
uroven lvl = new uroven();
lvl.Show();
this.Close();
}
else if (odcitani.IsChecked.HasValue && odcitani.IsChecked.Value)
{
uroven lvl = new uroven();
lvl.Show();
this.Close();
}
else if (nasobeni.IsChecked.HasValue && nasobeni.IsChecked.Value)
{
uroven lvl = new uroven();
lvl.Show();
this.Close();
}
else if (deleni.IsChecked.HasValue && deleni.IsChecked.Value)
{
uroven lvl = new uroven();
lvl.Show();
this.Close();
}
else
{
MessageBox.Show("Musíš zvolit, jednu z početních operací!");
}
}
}
}
tady máš nějaké vysvětlení
https://stackoverflow.com/…become-false
ale radiobutton nemá možnost že nebude mít hodnotu, nebo se pletu?
podle manuálu jo
https://docs.microsoft.com/…on.ischecked?…
píše se tam :
public bool? IsChecked { get; set; }
takže ? značí 3 hodnoty ... null, true, false
je možné, když mám dvě skupiny radiobuttonů, abych zkontroloval jestli jsou obě označené nebo je musím vypsat?
if (scitani.IsChecked.HasValue == true && scitani.IsChecked.Value == true && nizsi.IsChecked.HasValue == true && nizsi.IsChecked.Value == true)
takto když mají hodnotu aby se dalo dále pokračovat
else if (nazevprvniskupiny.IsChecked.HasValue == false && nazevprvniskupiny.IsChecked.Value == false && nazevdruheskupiny.IsChecked.HasValue == true && nazevdruheskupiny.IsChecked.Value == true)
{
MessageBox.Show("Musíš zvolit, jednu z početních operací!");
}
takto nějak kdyby to vypadalo
Je to možné?
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ů
...
scitani je radiobutton, vypsat myslím že bych do podmínky if vypsal všechny možně kombinace IsChecked.HasValue == false a IsChecked.Value == false
ale tich kombinací by bylo hrozně
tak ten RadioButton nedělej třístavovej ale jenom normální dvoustavovej ne ??? k čemu ti bude třístavovej RadioButton ???
tady to je popsaný
https://social.msdn.microsoft.com/…-as-expected?…
jestli nepotřebuješ 3 stavy udělej dvoustavovej ne ?
i když vyřeším to jednoduše, prostě to vypíše hlášku na oboje
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;
jo už chápu co si tím myslel díky!!! ted zkusím tu třídu
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
Zobrazeno 48 zpráv z 48.