Difference between revisions of "CSharp:WPF WPF Tips"
From Aino Wiki
(→Ordine proprietà Margin) |
(No difference)
|
Latest revision as of 14:26, 13 September 2017
Si propongono Tips che si implementano nel fronte Code Behind, la parte propriamente XAML è nella apposita sezione.
Interfaccia
Puntatore
Per visualizzare la clessidra, la mano o altro:
System.Windows.Input.Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; // System.Windows.Input.Cursors.Hand; System.Windows.Input.Mouse.OverrideCursor = null;
Clessidra
Usando il Dispatcher
esempio:
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { Dispatcher.Invoke((Action)(() => { busyIndicatorDetails.IsBusy = true; })); // ... etc ... Dispatcher.Invoke((Action)(() => { busyIndicatorDetails.IsBusy = false; })); }
Altro:
Application.Current.Dispatcher.Invoke( new Action(() => IsBusy = true) );
Controlli UI
Ricerche di controlli
Da un controllo custom padre è possibile cercare oggetti nei controlli figlio usando FindName
:
// vAccTracking è l'istanza di un controllo con uno XAML private AccTracking _vAccTracking; public AccTracking vAccTracking { get { return _vAccTracking; } set { _vAccTracking = value; } } //... if (vAccTracking.FindName("RD_NEW") != null && vAccTracking.FindName("RD_REAID") != null) { RadioButton rbRD_NEW = (RadioButton)vAccTracking.FindName("RD_NEW"); RadioButton rbRD_REAID = (RadioButton)vAccTracking.FindName("RD_REAID"); rbRD_NEW.IsChecked = false; rbRD_REAID.IsChecked = false; } else { log.Error("Controls 'RD_NEW' and\\or 'RD_REAID' NOT FOUND!"); }
Validazioni
Supponendo di voler togliere una validazione di tipo campo obbligatorio ad un controllo data datePicker, se nello XAML c'è:
<DatePicker Grid.Row="6" Grid.Column="4" Name="dtRecallDueDate" Margin="6,10,19,10" Visibility="{Binding Path=FLG_status_Progress, Converter={StaticResource BooleanToVisibility} , ConverterParameter='1', UpdateSourceTrigger='PropertyChanged'}" > <DatePicker.SelectedDate> <Binding Path="DT_NEXT_RECALL" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" Converter='{StaticResource ShortDateConverter}' > <Binding.ValidationRules> <CustomerValidators:RequiredCustomerValidator Controlname="{l:LocalizeByModule DefaultValue='Recall Due Date', Key=dtRecallDueDate}"> <CustomerValidators:RequiredCustomerValidator.CustomerType> <CustomerValidators:CustomerType DataContext="{Binding Source={StaticResource DataContextBridge}, Path=DataContext}" CustomerTypeCode="{Binding IsDT_NEXT_RECALLRequired}" /> </CustomerValidators:RequiredCustomerValidator.CustomerType> <CustomerValidators:RequiredCustomerValidator.ValidationParam> <CustomerValidators:Param DataContext="{Binding Source={StaticResource DataContextBridge}, Path=DataContext}" Key="DT_NEXT_RECALL" Value="{Binding DT_NEXT_RECALL}" /> </CustomerValidators:RequiredCustomerValidator.ValidationParam> </CustomerValidators:RequiredCustomerValidator> </Binding.ValidationRules> </Binding> </DatePicker.SelectedDate> </DatePicker>
Da codice:
DatePicker dtRecallDueDate = (DatePicker)vAccTracking.FindName("dtRecallDueDate"); // ? Binding binding = BindingOperations.GetBinding(dtRecallDueDate, DatePicker.TextProperty); Binding binding = BindingOperations.GetBinding(dtRecallDueDate, DatePicker.SelectedDateProperty); binding.ValidationRules.Clear();
Visualizzazioni
Far apparire e nascondere
Nel caso di due icone indicanti uno stato, ecco un esempio come impostare la visualizzazione rendendo visibile o nascondendo oggetti UI:
XAML
<StackPanel Orientation="Horizontal" Margin="0,5,0,0"> <StackPanel Orientation="Vertical"> <Button Name="btnAccTracking" Style="{StaticResource btnHyperlink}" Click="ShowDetailView" CommandParameter="ACCTracking" Padding="1" Margin="20,0,0,0" Content="{l:LocalizeByModule DefaultValue='ACC Tracking', Key=ACCTracking}" Height="19" BorderThickness="1,0"/> <Border Name="brdAccTracking" BorderThickness="1,0,1,1" BorderBrush="#0096d7" Margin="20,0,0,0" MaxWidth="120" Visibility="Collapsed"/> </StackPanel> <Image Name="icoGreen" Source="/FOX.Themes;component/Images/ELEMENTS/ico-statusgreen-10.png" Visibility="{Binding Path='FLG_status_Completed', Converter={StaticResource BooleanToVisibility} , ConverterParameter='1', UpdateSourceTrigger='PropertyChanged'}" Margin="10,0,0,0" /> <Image Name="icoRed" Source="/FOX.Themes;component/Images/ELEMENTS/ico-statusred-10.png" Visibility="{Binding Path='FLG_status_Progress', Converter={StaticResource BooleanToVisibility} , ConverterParameter='1', UpdateSourceTrigger='PropertyChanged'}" Margin="10,0,0,0"/> </StackPanel>
Codice C# associato:
icoRed.Visibility = System.Windows.Visibility.Visible; icoGreen.Visibility = System.Windows.Visibility.Collapsed;
Ordine proprietà Margin
I parametri sono assegnati in senso orario partendo da SINISTRA.
Esempio:
XAML
<RadioButton Margin="1,2,3,4" Visibility="Visible"></RadioButton>
Effetto:
1 = Left,
2 = Top,
3 = Right,
4 = Bottom
Varie
Windows Form
E' possibile integrare in un progetto WPF alcuni controlli presenti nelle Windows Form ciò perché alcuni di questi ultimi non sono stati riscritti e quindi integrati come controlli originari per WPF.
FolderBrowserDialog
Questo controllo consente di selezionare un percorso sul File system mediante l'ausilio di una finestra che consente di navigarci e selezionare un percorso da riportare ad es in una TextBox. (Finestra di dialogo per selezionare una directory esistente)
E' una libreria esterna quindi come prima cosa occorre aggiungere la Reference nel progetto WPF, la libreria si chiama: System.Windows.Form.
Infine occorre integrare il riferimento nella classe in cui serve la finestra di dialogo mediante una Using, si potrà adottare la forma compatta:
using WinForms = System.Windows.Forms;
Ogni risorsa della libreria sarà accessibile con: WinForms.Risorsa
Esempio
using WinForms = System.Windows.Forms; namespace SimplyFileBackup { public partial class MainWindow : Window { public WinForms.FolderBrowserDialog m_folderBrowserDialog = new WinForms.FolderBrowserDialog(); // Apertura della finestra !!! private void BtnSelect_SourcePath_Click(object sender, RoutedEventArgs e) { m_folderBrowserDialog.SelectedPath = TxtSourcePath.Text.Trim(); WinForms.DialogResult result = m_folderBrowserDialog.ShowDialog(); if (result == WinForms.DialogResult.OK) { TxtSourcePath.Text = m_folderBrowserDialog.SelectedPath; } } } }
Oggetti
Conversioni
ObservableCollection
Sono liste usate nelle viste che a differenza di quelle tradizionali (List<T>) ogni modifica intervenuta su i suoi items fa scattare eventi di aggiornamento sulla UI (User Interface).
private ObservableCollection<MaintenanceListModel> _MaintenanceList = new ObservableCollection<MaintenanceListModel>(); public ObservableCollection<MaintenanceListModel> MaintenanceList { get { return _MaintenanceList; } set { _MaintenanceList = value; OnPropertyChanged("MaintenanceList"); } } // ------------ List<MaintenanceListModel> mnts = new List<MaintenanceListModel>(); // etc MaintenanceList = new ObservableCollection<MaintenanceListModel>(mnts.OrderByDescending(x => x.PurchaseDate));
Mappa e Link
C# | WPF | WPF Soluzioni varie
Parole chiave: Folder Browser dialog