का कारण बन रहा है, मैं थोड़ी देर के लिए इस मुद्दे पर तेज़ी से बढ़ रहा हूं, और केवल समाधान का हिस्सा पाया है।टैबकंट्रोल- उपयोगकर्ता को चयनित टैब को बदलने से रोकना: संदेशबॉक्स बग
मैं एक टैबकंट्रोल स्थापित करने की कोशिश कर रहा हूं ताकि मैं कुछ मामलों में उपयोगकर्ता को वर्तमान में चयनित टैब को बदलने से रोक सकूं। जब उपयोगकर्ता को वर्तमान में चयनित टैब को बदलने से रोका जाता है, तो उन्हें एक संवाद बॉक्स दिखाया जाता है।
मैं पहले से ही निम्नलिखित दस्तावेजों को पढ़ लिया है:
- WPF - reset ListBox scroll position when ItemsSource changes
- http://wizardsofsmart.net/uncategorized/itemssourcechanged-event-using-attached-dependency-properties/
- http://joshsmithonwpf.wordpress.com/2009/09/04/how-to-prevent-a-tabitem-from-being-selected/
- http://social.expression.microsoft.com/Forums/en-US/wpf/thread/f7b46018-1e97-4bbe-ada8-49b75dbc1da2/
मैं समाधान 3 लिंक में संकेत को लागू किया है (हालांकि सभी उपरोक्त में से एक ही त्रुटि बनाते हैं नीचे ईन)। और यह काम करता है, लेकिन ...
हालात गंदगी उपयोगकर्ता निम्न करता है अच्छी तरह से करता है, तो: जब इस तरह की कार्रवाई की अनुमति नहीं है टैब बदलने के लिए
- प्रयास। संदेशबॉक्स त्रुटि के साथ पॉप अप करता है।
- उपयोगकर्ता "ठीक" पर क्लिक करता है और मूल विंडो पर वापस आ जाता है।
- उपयोगकर्ता टैब को बदलने के लिए फिर से प्रयास करता है। कोई संदेश बॉक्स प्रकट होता है।
- यदि उपयोगकर्ता विंडो को कम करता है, और उसके बाद इसे फिर से अधिकतम करता है, तो संदेशबॉक्स जो पहले प्रकट होता था प्रकट होता है।
- उपयोगकर्ता "ओके" पर क्लिक करता है और मूल विंडो पर वापस आ जाता है ... लेकिन टैब को पहले से चुने गए एक में बदल दिया गया है, भले ही वे टैब को बदलने में सक्षम न हों।
यह स्पष्ट रूप से नहीं आदर्श व्यवहार है। संदेशबॉक्स दूसरी बार क्यों नहीं दिख रहा है, और टैब को तब से क्यों बदल रहा है जब इसे ऐसा करने से मना किया जाना चाहिए?
यदि मैं संदेशबॉक्स भाग को हटा देता हूं, तो यह ठीक काम करता है।
bool _isChanging = false;
private void tabControlForNavigation_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!_isChanging && canChangeTabs.IsChecked.HasValue)
{
_isChanging = true;
bool canLeave = canChangeTabs.IsChecked.Value; //normally this would be replaced by a check in the ViewModel
if (!canLeave)
{
int prevIndex = tabControlForNavigation.Items.IndexOf(tabControlForNavigation.SelectedContent);
tabControlForNavigation.SelectedIndex = prevIndex;
MessageBox.Show("Can't change tabs!"); //if I comment out this line, everything works fine.
}
_isChanging = false;
}
}
मैं MVVM उपयोग कर रहा हूँ इस लागू करने के लिए:
यहाँ TabControl.SelectionChanged ईवेंट हैंडलर के लिए कोड है। खिड़की इस तरह दिखता है:
<Window x:Class="TestTabControlSwitching.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="350"
Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<CheckBox x:Name="canChangeTabs"
Content="Can Change Tabs"
IsChecked="True" />
<TabControl x:Name="tabControlForNavigation"
Grid.Row="1"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Collection}"
SelectedItem="{Binding SelectedItem}"
SelectionChanged="tabControlForNavigation_SelectionChanged"
Margin="4"
HorizontalAlignment="Stretch">
<TabControl.ItemTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Path=Name}" />
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
</Grid>
मैं brevity- की खातिर कोड के बाकी को छोड़ते हुए कर रहा हूँ वहाँ एक बहुत सीधी-सपाट ViewModel संरचना खिड़की का समर्थन कर रहा है।
क्या हम जानते हैं कि यह WPF में एक बग है या नहीं? या यह "डिजाइन द्वारा" कुछ अजीब कारण के लिए है? – skybluecodeflier
मुझे यकीन नहीं है, इसने मेरे लिए कुछ साल पहले कारण खोजा लेकिन कभी भी कोई जानकारी नहीं मिली। बस इसे परावर्तक के साथ देखा लेकिन यह जटिल है कि क्या हो रहा है .. –