Witajcie,
Próbuję zrozumieć BindingOperations.
Logika programu działa bez zarzutu, ale w momencie gdy w podrzędnym oknie pierwszy raz wywołuję EnableCollectionSynchronization(collection, lock) wszystkie okna włącznie z głównym (nadrzędnym), zmniejszają rozmiary okna oraz rozmiar czcionek w stosunku do zaprojektowanych. Okno nadrzędne, które ma ustawione WindowState: Maximixed skaluje się do 3/4 ekranu.
Próbowałem nawet proste przykłady z sieci dla "observable collection" i zawsze przy pierwszym uruchomieniu EnableCollectionSynchronization dzieje się tak samo - zmiana rozmiaru i czcionek.
Dlaczego EnableCollectionSynchronization oddziałuje na wszystkie okna skoro w parametrach podaję konkretną kolekcję? Czego nie wiem? Jest jakaś możliwość zablokowania tego "ogólnego" oddziaływania?
Poradźcie proszę
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
}
}
public partial class Form2 : Form
{
private ObservableCollection<string> collection;
private object _lock = new object();
public Form2()
{
InitializeComponent();
collection = new ObservableCollection<string>();
collection.CollectionChanged += HandleChange;
BindingOperations.EnableCollectionSynchronization(collection, _lock);
}
private void HandleChange(object sender, NotifyCollectionChangedEventArgs e)
{
}
}
ObservableCollection i EnableCollectionSynchronization to są mechanizmy pochodzące z WPF, a Ty piszesz w WinForms ...
neves napisał(a):
ObservableCollection i EnableCollectionSynchronization to są mechanizmy pochodzące z WPF, a Ty piszesz w WinForms ...
Dzięki neves za podpowiedź. Podrzuciłeś mi myśl o co pytać googla i już się douczam.
Dla mnie środowiskiem naturalnym jest WinForms, ale zabrakło mi tego elementu i próbuję zrobić hybrydę WF z WPF.
OK. Znalazłem że winna jest zmiana CurrentAutoScaleDimension z (96, 96) na (120, 120), po wywołaniu EnableCollectionSynchronization.
Teraz pytanie jak tego uniknąć...
Poniższe załatwia sprawę,.choć wygodniejsze wydaje się SetProcessDpiAwarenessContext().
If an third-party/external component, which references a WPF assemblies, redefines the DPI-Awareness status of an application, this automatic behaviour can be disabled, inserting a paramert in the Project Assemblyinfo.cs:
[assembly: System.Windows.Media.DisableDpiAwareness]
Zamykam.