Merge master into feature/GraphingCalculator branch (#660)

This commit is contained in:
Pepe Rivera
2019-09-05 15:01:12 -07:00
committed by GitHub
parent 1c9755d38a
commit 41fbcfe9c5
199 changed files with 5809 additions and 2925 deletions

View File

@@ -35,8 +35,8 @@
</DataTemplate>
<!-- TextBox Styles -->
<Style TargetType="controls:OverflowTextBlock">
<Style x:Key="NormalStyle" TargetType="controls:OverflowTextBlock">
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="Template">
<Setter.Value>
@@ -94,6 +94,110 @@
</Setter>
</Style>
<Style x:Key="AlwaysOnTopStyleS" TargetType="controls:OverflowTextBlock">
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="ColumnWidth" Value="14"/>
<Setter Property="ColumnHeight" Value="14"/>
<Setter Property="ScrollButtonFontSize" Value="12"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls:OverflowTextBlock">
<Grid x:Name="TokenContainer" Background="{TemplateBinding Background}">
<Grid.Resources>
<ResourceDictionary>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Light">
<SolidColorBrush x:Key="ButtonBackgroundPointerOver" Color="Transparent"/>
<SolidColorBrush x:Key="ButtonBackgroundPressed" Color="Transparent"/>
<SolidColorBrush x:Key="ButtonBackgroundDisabled" Color="Transparent"/>
<SolidColorBrush x:Key="ButtonForeground" Color="#99000000"/>
<SolidColorBrush x:Key="ButtonForegroundPointerOver" Color="{ThemeResource SystemAccentColor}" Opacity="0.8"/>
<SolidColorBrush x:Key="ButtonForegroundPressed" Color="{ThemeResource SystemAccentColor}" Opacity="1.0"/>
<SolidColorBrush x:Key="ButtonForegroundDisabled" Color="#33000000"/>
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrast">
<SolidColorBrush x:Key="ButtonBackgroundPointerOver" Color="Transparent"/>
<SolidColorBrush x:Key="ButtonBackgroundPressed" Color="Transparent"/>
<SolidColorBrush x:Key="ButtonBackgroundDisabled" Color="Transparent"/>
<SolidColorBrush x:Key="ButtonForeground" Color="{ThemeResource SystemColorWindowTextColor}" Opacity="0.6"/>
<SolidColorBrush x:Key="ButtonForegroundPointerOver" Color="{ThemeResource SystemColorHighlightColor}" Opacity="0.8"/>
<SolidColorBrush x:Key="ButtonForegroundPressed" Color="{ThemeResource SystemColorHighlightColor}" Opacity="1.0"/>
<SolidColorBrush x:Key="ButtonForegroundDisabled" Color="{ThemeResource SystemColorGrayTextColor}" Opacity="0.2"/>
</ResourceDictionary>
<ResourceDictionary x:Key="Dark">
<SolidColorBrush x:Key="ButtonBackgroundPointerOver" Color="Transparent"/>
<SolidColorBrush x:Key="ButtonBackgroundPressed" Color="Transparent"/>
<SolidColorBrush x:Key="ButtonBackgroundDisabled" Color="Transparent"/>
<SolidColorBrush x:Key="ButtonForeground" Color="#99FFFFFF"/>
<SolidColorBrush x:Key="ButtonForegroundPointerOver" Color="{ThemeResource SystemAccentColorLight1}" Opacity="0.8"/>
<SolidColorBrush x:Key="ButtonForegroundPressed" Color="{ThemeResource SystemAccentColorLight1}" Opacity="1.0"/>
<SolidColorBrush x:Key="ButtonForegroundDisabled" Color="#33FFFFFF"/>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ScrollViewer x:Name="ExpressionContainer"
Grid.Column="0"
Grid.ColumnSpan="3"
Padding="0,0,0,0"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Style="{StaticResource ResultsScrollerSnapped}"
AutomationProperties.AccessibilityView="Control">
<TextBlock x:Name="EditableToken"
AutomationProperties.AccessibilityView="Raw"
Text="{Binding DisplayValue, Mode=OneWay}"
Margin="4,0,4,0"
Padding="0"
VerticalAlignment="Stretch"
FontWeight="SemiBold"
Grid.Row="2"
HorizontalAlignment="Right"/>
</ScrollViewer>
<Border Background="{ThemeResource AppChromeAcrylicHostBackdropMediumLowBrush}"
Grid.Column="0">
<Button x:Name="ScrollLeft"
x:Uid="scrollLeft"
Margin="0,3,0,0"
Style="{StaticResource AlwaysOnTopScrollButtonStyleS}"
MinWidth="{TemplateBinding ColumnWidth}"
MinHeight="{TemplateBinding ColumnHeight}"
Background="Transparent">
<FontIcon FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="{TemplateBinding ScrollButtonFontSize}"
Glyph="&#xE26C;"/>
</Button>
</Border>
<Border Background="{ThemeResource AppChromeAcrylicHostBackdropMediumLowBrush}"
Grid.Column="2">
<Button x:Name="ScrollRight"
x:Uid="scrollRight"
Margin="0,3,0,0"
Style="{StaticResource AlwaysOnTopScrollButtonStyleS}"
MinWidth="{TemplateBinding ColumnWidth}"
MinHeight="{TemplateBinding ColumnHeight}"
Background="Transparent">
<FontIcon FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="{TemplateBinding ScrollButtonFontSize}"
Glyph="&#xE26B;"/>
</Button>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="AlwaysOnTopStyleM" BasedOn="{StaticResource AlwaysOnTopStyleS}" TargetType="controls:OverflowTextBlock">
<Setter Property="ColumnWidth" Value="28"/>
<Setter Property="ColumnHeight" Value="280"/>
<Setter Property="ScrollButtonFontSize" Value="28"/>
</Style>
<!-- Calculation Result Styles -->
<Style x:Key="ResultsStyle"
BasedOn="{StaticResource CalculationResultStyle}"
@@ -119,6 +223,13 @@
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
<Style x:Key="AlwaysOnTopScrollButtonStyleS" TargetType="Button">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="0,0,0,0"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
<!-- Flyout Styles -->
@@ -237,7 +348,6 @@
<!-- Value Converters -->
<converters:BooleanToVisibilityNegationConverter x:Key="BooleanToVisibilityNegationConverter"/>
<converters:BooleanNegationConverter x:Key="BooleanNegationConverter"/>
<!-- DataTemplate Selectors and Style Selectors -->
@@ -289,6 +399,28 @@
<Storyboard Completed="OnErrorLayoutCompleted"/>
</VisualState>
</VisualStateGroup>
<!-- Always-on-Top specific -->
<VisualStateGroup x:Name="AlwaysOnTopStates">
<VisualState x:Name="AlwaysOnTop">
<VisualState.Setters>
<Setter Target="ClearMemoryButton.IsEnabled" Value="False"/>
<Setter Target="MemRecall.IsEnabled" Value="False"/>
<Setter Target="MemPlus.IsEnabled" Value="False"/>
<Setter Target="MemMinus.IsEnabled" Value="False"/>
<Setter Target="MemButton.IsEnabled" Value="False"/>
<Setter Target="RowExpression.Height" Value="0*"/>
<Setter Target="RowHamburger.Height" Value="0"/>
<Setter Target="RowMemoryControls.Height" Value="0*"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Normal">
<VisualState.Setters>
<Setter Target="RowExpression.Height" Value="20*"/>
<Setter Target="RowHamburger.Height" Value="{StaticResource HamburgerHeightGridLength}"/>
<Setter Target="RowMemoryControls.Height" Value="32*"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<!-- Mode specific -->
<VisualStateGroup x:Name="Mode">
<VisualState x:Name="Standard">
@@ -319,7 +451,7 @@
</VisualState>
</VisualStateGroup>
<!-- Layout specific -->
<VisualStateGroup>
<VisualStateGroup CurrentStateChanged="OnVisualStateChanged">
<VisualState x:Name="Portrait768x1366">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowHeight="1366" MinWindowWidth="768"/>
@@ -365,7 +497,7 @@
<AdaptiveTrigger MinWindowHeight="0" MinWindowWidth="0"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="RowMemoryControls.MinHeight" Value="24"/>
<Setter Target="RowMemoryControls.MinHeight" Value="0"/>
<Setter Target="ClearMemoryButton.Style" Value="{StaticResource CaptionButtonStyle}"/>
<Setter Target="MemRecall.Style" Value="{StaticResource CaptionButtonStyle}"/>
@@ -378,6 +510,30 @@
</VisualState>
</VisualStateGroup>
<!-- Results display specific -->
<VisualStateGroup>
<VisualState x:Name="RegularAlwaysOnTop">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowHeight="260"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="RowResult.MinHeight" Value="54"/>
<Setter Target="RowResult.Height" Value="72*"/>
<Setter Target="AlwaysOnTopResults.FontSize" Value="40"/>
<Setter Target="AlwaysOnTopResults.Style" Value="{StaticResource AlwaysOnTopStyleM}"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="MinAlwaysOnTop">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowHeight="0"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="RowResult.MinHeight" Value="20"/>
<Setter Target="RowResult.Height" Value="72*"/>
<Setter Target="AlwaysOnTopResults.FontSize" Value="18"/>
<Setter Target="AlwaysOnTopResults.Style" Value="{StaticResource AlwaysOnTopStyleS}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup>
<VisualState x:Name="ResultsL">
<VisualState.StateTriggers>
@@ -420,24 +576,34 @@
<RowDefinition x:Name="RowHamburger" Height="{StaticResource HamburgerHeightGridLength}"/>
<RowDefinition x:Name="RowExpression"
Height="20*"
MinHeight="20"/>
MinHeight="0"/>
<RowDefinition x:Name="RowResult"
Height="72*"
MinHeight="72"/>
MinHeight="20"/>
<RowDefinition x:Name="RowDisplayControls" Height="0"/>
<RowDefinition x:Name="RowMemoryControls"
Height="32*"
MinHeight="32"/>
MinHeight="0"/>
<RowDefinition x:Name="RowNumPad"
Height="308*"
MinHeight="0"/>
</Grid.RowDefinitions>
<controls:OverflowTextBlock x:Name="ExpressionText"
Grid.Row="1"
Margin="6,0,6,0"
Style="{StaticResource NormalStyle}"
VerticalAlignment="Bottom"
AutomationProperties.AutomationId="CalculatorExpression"
AutomationProperties.Name="{x:Bind Model.CalculationExpressionAutomationName, Mode=OneWay}"
IsTabStop="False"
TokensUpdated="{x:Bind Model.AreTokensUpdated, Mode=OneWay}"
Visibility="{x:Bind Model.IsAlwaysOnTop, Converter={StaticResource BooleanToVisibilityNegationConverter}, Mode=OneWay}"/>
<controls:CalculationResult x:Name="Results"
x:Uid="CalculatorResults"
Grid.Row="2"
Margin="0,0,0,0"
Style="{ThemeResource ResultsStyle}"
Style="{StaticResource ResultsStyle}"
AutomationProperties.AutomationId="CalculatorResults"
AutomationProperties.HeadingLevel="Level1"
AutomationProperties.Name="{x:Bind Model.CalculationResultAutomationName, Mode=OneWay}"
@@ -448,15 +614,20 @@
ExpressionVisibility="Visible"
IsInError="{x:Bind Model.IsInError, Mode=OneWay}"
IsOperatorCommand="{x:Bind Model.IsOperatorCommand, Mode=OneWay}"
TabIndex="1"/>
<controls:OverflowTextBlock x:Name="ExpressionText"
Grid.Row="1"
TabIndex="1"
Visibility="{x:Bind Model.IsAlwaysOnTop, Converter={StaticResource BooleanToVisibilityNegationConverter}, Mode=OneWay}"/>
<controls:OverflowTextBlock x:Name="AlwaysOnTopResults"
x:Uid="CalculatorAlwaysOnTopResults"
Grid.Row="2"
Margin="6,0,6,0"
VerticalAlignment="Bottom"
AutomationProperties.AutomationId="CalculatorExpression"
AutomationProperties.Name="{x:Bind Model.CalculationExpressionAutomationName, Mode=OneWay}"
IsTabStop="False"
TokensUpdated="{x:Bind Model.AreTokensUpdated, Mode=OneWay}"/>
AutomationProperties.AutomationId="CalculatorAlwaysOnTopResults"
AutomationProperties.HeadingLevel="Level1"
AutomationProperties.Name="{x:Bind Model.CalculationResultAutomationName, Mode=OneWay}"
TokensUpdated="{x:Bind Model.AreAlwaysOnTopResultsUpdated, Mode=OneWay}"
HorizontalContentAlignment="Right"
IsActive="True"
UseSystemFocusVisuals="True"
Visibility="{x:Bind Model.IsAlwaysOnTop, Mode=OneWay}"/>
<!-- Programmer display panel controls -->
<local:CalculatorProgrammerOperators x:Name="ProgrammerOperators"
@@ -473,25 +644,29 @@
TabIndex="7"
Visibility="{x:Bind Model.IsProgrammer, Mode=OneWay}"/>
<Button x:Name="HistoryButton"
<Grid x:Name="HistoryButtonParent"
Visibility="{x:Bind Model.IsAlwaysOnTop, Converter={StaticResource BooleanToVisibilityNegationConverter}, Mode=OneWay}">
<Button x:Name="HistoryButton"
x:Uid="HistoryButton"
Grid.Row="0"
IsEnabled="{x:Bind Model.IsAlwaysOnTop, Converter={StaticResource BooleanNegationConverter}, Mode=OneWay}"
Style="{StaticResource HistoryButtonStyle}"
AutomationProperties.AutomationId="HistoryButton"
Command="{x:Bind HistoryButtonPressed, Mode=OneTime}"
Content="&#xe81c;"
ExitDisplayModeOnAccessKeyInvoked="False"
TabIndex="2">
<FlyoutBase.AttachedFlyout>
<Flyout x:Name="HistoryFlyout"
AutomationProperties.AutomationId="HistoryFlyout"
Closed="HistoryFlyout_Closed"
FlyoutPresenterStyle="{ThemeResource HistoryFlyoutStyle}"
Opened="HistoryFlyout_Opened"
Placement="Full"/>
</FlyoutBase.AttachedFlyout>
</Button>
<FlyoutBase.AttachedFlyout>
<Flyout x:Name="HistoryFlyout"
AutomationProperties.AutomationId="HistoryFlyout"
Closed="HistoryFlyout_Closed"
FlyoutPresenterStyle="{StaticResource HistoryFlyoutStyle}"
Opened="HistoryFlyout_Opened"
Placement="Full"/>
</FlyoutBase.AttachedFlyout>
</Button>
</Grid>
<!-- Scientific angle buttons -->
<local:CalculatorScientificAngleButtons x:Name="ScientificAngleButtons"
Grid.Row="3"
@@ -505,6 +680,7 @@
x:Uid="MemoryPanel"
Grid.Row="4"
Margin="3,0,3,0"
Visibility="{x:Bind Model.IsAlwaysOnTop, Converter={StaticResource BooleanToVisibilityNegationConverter}, Mode=OneWay}"
AutomationProperties.HeadingLevel="Level1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" MaxWidth="80"/>
@@ -583,7 +759,7 @@
x:Uid="MemoryFlyout"
AutomationProperties.AutomationId="MemoryFlyout"
Closed="OnMemoryFlyoutClosed"
FlyoutPresenterStyle="{ThemeResource MemoryFlyoutStyle}"
FlyoutPresenterStyle="{StaticResource MemoryFlyoutStyle}"
Opened="OnMemoryFlyoutOpened"
Placement="Full"/>
</FlyoutBase.AttachedFlyout>
@@ -944,7 +1120,6 @@
</Border.Resources>
<Pivot x:Name="DockPivot"
SelectionChanged="DockPivot_SelectionChanged"
TabIndex="5"
Tapped="DockPanelTapped"
Template="{StaticResource DockPanelTemplate}">

View File

@@ -40,6 +40,7 @@ using namespace Windows::UI::ViewManagement;
DEPENDENCY_PROPERTY_INITIALIZATION(Calculator, IsStandard);
DEPENDENCY_PROPERTY_INITIALIZATION(Calculator, IsScientific);
DEPENDENCY_PROPERTY_INITIALIZATION(Calculator, IsProgrammer);
DEPENDENCY_PROPERTY_INITIALIZATION(Calculator, IsAlwaysOnTop);
Calculator::Calculator()
: m_doAnimate(false)
@@ -60,6 +61,8 @@ Calculator::Calculator()
auto resLoader = AppResourceProvider::GetInstance();
CopyMenuItem->Text = resLoader.GetResourceString(L"copyMenuItem");
PasteMenuItem->Text = resLoader.GetResourceString(L"pasteMenuItem");
this->SizeChanged += ref new SizeChangedEventHandler(this, &Calculator::Calculator_SizeChanged);
}
void Calculator::LoadResourceStrings()
@@ -97,7 +100,7 @@ void Calculator::SetFontSizeResources()
{ L"Tibt", 104, 29.333, 20, 40, 56, 40, 56 }, { L"Default", 104, 29.333, 23, 40, 56, 40, 56 }
};
DecimalFormatter^ formatter = LocalizationService::GetInstance()->GetRegionalSettingsAwareDecimalFormatter();
DecimalFormatter ^ formatter = LocalizationService::GetInstance()->GetRegionalSettingsAwareDecimalFormatter();
const FontTable* currentItem = fontTables;
while (currentItem->numericSystem.compare(std::wstring(L"Default")) != 0 && currentItem->numericSystem.compare(formatter->NumeralSystem->Data()) != 0)
@@ -135,7 +138,7 @@ void Calculator::OnLoaded(_In_ Object ^, _In_ RoutedEventArgs ^)
WeakReference weakThis(this);
this->Dispatcher->RunAsync(
CoreDispatcherPriority::Normal, ref new DispatchedHandler([weakThis]() {
if (TraceLogger::GetInstance().UpdateWindowIdLog(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread())))
if (TraceLogger::GetInstance().IsWindowIdInLog(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread())))
{
auto refThis = weakThis.Resolve<Calculator>();
if (refThis != nullptr)
@@ -279,6 +282,35 @@ void Calculator::OnIsProgrammerPropertyChanged(bool /*oldValue*/, bool newValue)
UpdatePanelViewState();
}
void Calculator::OnIsAlwaysOnTopPropertyChanged(bool /*oldValue*/, bool newValue)
{
if (newValue)
{
VisualStateManager::GoToState(this, L"AlwaysOnTop", false);
}
else
{
VisualStateManager::GoToState(this, L"Normal", false);
if (Model->IsInError)
{
VisualStateManager::GoToState(this, L"ErrorLayout", false);
}
else
{
EnableMemoryControls(true);
}
}
Model->IsMemoryEmpty = (Model->MemorizedNumbers->Size == 0) || IsAlwaysOnTop;
AlwaysOnTopResults->UpdateScrollButtons();
Results->UpdateTextState();
UpdateViewState();
UpdatePanelViewState();
SetDefaultFocus();
}
void Calculator::OnIsInErrorPropertyChanged()
{
bool isError = Model->IsInError;
@@ -395,33 +427,36 @@ void Calculator::UpdateHistoryState()
void Calculator::UpdateMemoryState()
{
if (!Model->IsMemoryEmpty)
if (!IsAlwaysOnTop)
{
MemRecall->IsEnabled = true;
ClearMemoryButton->IsEnabled = true;
}
else
{
MemRecall->IsEnabled = false;
ClearMemoryButton->IsEnabled = false;
}
String ^ viewState = App::GetAppViewState();
if (viewState == ViewState::DockedView)
{
CloseMemoryFlyout();
SetChildAsMemory();
MemoryButton->Visibility = ::Visibility::Collapsed;
if (m_IsLastFlyoutMemory && !IsProgrammer)
if (!Model->IsMemoryEmpty)
{
DockPivot->SelectedIndex = 1;
MemRecall->IsEnabled = true;
ClearMemoryButton->IsEnabled = true;
}
else
{
MemRecall->IsEnabled = false;
ClearMemoryButton->IsEnabled = false;
}
String ^ viewState = App::GetAppViewState();
if (viewState == ViewState::DockedView)
{
CloseMemoryFlyout();
SetChildAsMemory();
MemoryButton->Visibility = ::Visibility::Collapsed;
if (m_IsLastFlyoutMemory && !IsProgrammer)
{
DockPivot->SelectedIndex = 1;
}
}
else
{
MemoryButton->Visibility = ::Visibility::Visible;
DockMemoryHolder->Child = nullptr;
}
}
else
{
MemoryButton->Visibility = ::Visibility::Visible;
DockMemoryHolder->Child = nullptr;
}
}
@@ -450,13 +485,11 @@ void Calculator::OnHistoryItemClicked(_In_ HistoryItemViewModel ^ e)
unsigned int tokenSize;
assert(e->GetTokens() != nullptr);
e->GetTokens()->GetSize(&tokenSize);
TraceLogger::GetInstance().LogHistoryItemLoadBegin();
Model->SetHistoryExpressionDisplay(e->GetTokens(), e->GetCommands());
Model->SetExpressionDisplay(e->GetTokens(), e->GetCommands());
Model->SetPrimaryDisplay(e->Result->Data(), false);
Model->IsFToEEnabled = false;
TraceLogger::GetInstance().LogHistoryItemLoadEnd(tokenSize);
CloseHistoryFlyout();
this->Focus(::FocusState::Programmatic);
}
@@ -468,8 +501,6 @@ void Calculator::HistoryFlyout_Opened(_In_ Object ^ sender, _In_ Object ^ args)
m_IsLastFlyoutHistory = true;
EnableControls(false);
AutomationProperties::SetName(HistoryButton, m_closeHistoryFlyoutAutomationName);
TraceLogger::GetInstance().LogHistoryFlyoutOpenEnd(Model->HistoryVM->ItemSize);
TraceLogger::GetInstance().LogHistoryBodyOpened();
}
void Calculator::HistoryFlyout_Closing(_In_ FlyoutBase ^ sender, _In_ FlyoutBaseClosingEventArgs ^ args)
@@ -511,7 +542,14 @@ void Calculator::CloseMemoryFlyout()
void Calculator::SetDefaultFocus()
{
Results->Focus(::FocusState::Programmatic);
if (!IsAlwaysOnTop)
{
Results->Focus(::FocusState::Programmatic);
}
else
{
AlwaysOnTopResults->Focus(::FocusState::Programmatic);
}
}
void Calculator::ToggleHistoryFlyout(Object ^ /*parameter*/)
@@ -526,7 +564,6 @@ void Calculator::ToggleHistoryFlyout(Object ^ /*parameter*/)
}
else
{
TraceLogger::GetInstance().LogHistoryFlyoutOpenBegin(Model->HistoryVM->ItemSize);
HistoryFlyout->Content = m_historyList;
m_historyList->RowHeight = NumpadPanel->ActualHeight;
FlyoutBase::ShowAttachedFlyout(HistoryButton);
@@ -545,7 +582,6 @@ void Calculator::ToggleMemoryFlyout()
}
else
{
TraceLogger::GetInstance().LogMemoryFlyoutOpenBegin(Model->MemorizedNumbers->Size);
MemoryFlyout->Content = GetMemory();
m_memory->RowHeight = NumpadPanel->ActualHeight;
FlyoutBase::ShowAttachedFlyout(MemoryButton);
@@ -555,13 +591,11 @@ void Calculator::ToggleMemoryFlyout()
void Calculator::OnMemoryFlyoutOpened(_In_ Object ^ sender, _In_ Object ^ args)
{
TraceLogger::GetInstance().LogMemoryFlyoutOpenEnd(Model->MemorizedNumbers->Size);
m_IsLastFlyoutMemory = true;
m_IsLastFlyoutHistory = false;
m_fIsMemoryFlyoutOpen = true;
AutomationProperties::SetName(MemoryButton, m_closeMemoryFlyoutAutomationName);
EnableControls(false);
TraceLogger::GetInstance().LogMemoryBodyOpened();
}
void Calculator::OnMemoryFlyoutClosing(_In_ FlyoutBase ^ sender, _In_ FlyoutBaseClosingEventArgs ^ args)
@@ -700,14 +734,17 @@ void Calculator::OnMemoryAccessKeyInvoked(_In_ UIElement ^ sender, _In_ AccessKe
DockPivot->SelectedItem = MemoryPivotItem;
}
void CalculatorApp::Calculator::DockPivot_SelectionChanged(Platform::Object ^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs ^ e)
void CalculatorApp::Calculator::OnVisualStateChanged(Platform::Object ^ sender, Windows::UI::Xaml::VisualStateChangedEventArgs ^ e)
{
if (DockPivot->SelectedIndex == 0)
auto mode = IsStandard ? ViewMode::Standard : IsScientific ? ViewMode::Scientific : ViewMode::Programmer;
auto state = std::wstring(e->NewState->Name->Begin());
TraceLogger::GetInstance().LogVisualStateChanged(mode, state, IsAlwaysOnTop);
}
void Calculator::Calculator_SizeChanged(Object ^ /*sender*/, SizeChangedEventArgs ^ /*e*/)
{
if (Model->IsAlwaysOnTop)
{
TraceLogger::GetInstance().LogHistoryBodyOpened();
}
else
{
TraceLogger::GetInstance().LogMemoryBodyOpened();
AlwaysOnTopResults->UpdateScrollButtons();
}
}

View File

@@ -54,6 +54,7 @@ public
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(bool, IsStandard, false);
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(bool, IsScientific, false);
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(bool, IsProgrammer, false);
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(bool, IsAlwaysOnTop, false);
COMMAND_FOR_METHOD(HistoryButtonPressed, Calculator::ToggleHistoryFlyout);
@@ -76,12 +77,12 @@ public
void UpdateMemoryState();
void UpdateHistoryState();
void CalculationResultsOnSelected(_In_ Platform::Object ^ sender);
void OnContextRequested(Windows::UI::Xaml::UIElement ^ sender, Windows::UI::Xaml::Input::ContextRequestedEventArgs ^ e);
void OnContextCanceled(Windows::UI::Xaml::UIElement ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
void OnIsScientificPropertyChanged(bool oldValue, bool newValue);
void OnIsProgrammerPropertyChanged(bool oldValue, bool newValue);
void OnIsStandardPropertyChanged(bool oldValue, bool newValue);
void OnIsAlwaysOnTopPropertyChanged(bool oldValue, bool newValue);
void OnIsInErrorPropertyChanged();
void OnCalcPropertyChanged(_In_ Platform::Object ^ sender, _In_ Windows::UI::Xaml::Data::PropertyChangedEventArgs ^ e);
void OnStoryboardCompleted(_In_ Platform::Object ^ sender, _In_ Platform::Object ^ e);
@@ -90,6 +91,7 @@ public
void EnsureProgrammer();
void SetFontSizeResources();
std::wstring GetCurrentLayoutState();
void Calculator_SizeChanged(Object ^ sender, Windows::UI::Xaml::SizeChangedEventArgs ^ e);
private:
Windows::UI::Xaml::Controls::ListView ^ m_tokenList;
@@ -139,6 +141,6 @@ public
void OnErrorLayoutCompleted(_In_ Platform::Object ^ sender, _In_ Platform::Object ^ e);
void OnHistoryAccessKeyInvoked(_In_ Windows::UI::Xaml::UIElement ^ sender, _In_ Windows::UI::Xaml::Input::AccessKeyInvokedEventArgs ^ args);
void OnMemoryAccessKeyInvoked(_In_ Windows::UI::Xaml::UIElement ^ sender, _In_ Windows::UI::Xaml::Input::AccessKeyInvokedEventArgs ^ args);
void DockPivot_SelectionChanged(Platform::Object ^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs ^ e);
void OnVisualStateChanged(Platform::Object ^ sender, Windows::UI::Xaml::VisualStateChangedEventArgs ^ e);
};
}

View File

@@ -3,7 +3,6 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:common="using:CalculatorApp.Common"
xmlns:controls="using:CalculatorApp.Controls"
xmlns:converters="using:CalculatorApp.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:CalculatorApp"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@@ -14,11 +13,6 @@
Unloaded="OnUnloaded"
mc:Ignorable="d">
<UserControl.Resources>
<converters:BooleanNegationConverter x:Key="BooleanNegationConverter"/>
<converters:BooleanToVisibilityNegationConverter x:Key="BooleanToVisibilityNegationConverter"/>
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
<converters:BitFlipAutomationNameConverter x:Key="BitFlipAutomationNameConverter"/>
<Style x:Key="FlippingToggleButtonStyle" TargetType="ToggleButton">
<Setter Property="FontSize" Value="20"/>
<Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseHighBrush}"/>
@@ -141,7 +135,6 @@
<Setter Property="Foreground" Value="{ThemeResource AppControlPageTextBaseMediumHighBrush}"/>
<Setter Property="AutomationProperties.AccessibilityView" Value="Raw"/>
</Style>
</UserControl.Resources>
<Grid x:Name="BitFlipPanel"
x:Uid="BitFlipPanel"
@@ -304,569 +297,761 @@
<controls:FlipButtons x:Name="Bit63"
Grid.Column="1"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='63', Mode=OneWay}"
ButtonId="BINPOS63"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 63), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>63</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit62"
Grid.Column="2"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='62', Mode=OneWay}"
ButtonId="BINPOS62"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 62), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>62</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit61"
Grid.Column="3"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='61', Mode=OneWay}"
ButtonId="BINPOS61"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 61), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>61</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit60"
Grid.Column="4"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='60', Mode=OneWay}"
ButtonId="BINPOS60"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 60), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>60</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit59"
Grid.Column="6"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='59', Mode=OneWay}"
ButtonId="BINPOS59"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 59), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>59</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit58"
Grid.Column="7"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='58', Mode=OneWay}"
ButtonId="BINPOS58"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 58), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>58</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit57"
Grid.Column="8"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='57', Mode=OneWay}"
ButtonId="BINPOS57"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 57), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>57</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit56"
Grid.Column="9"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='56', Mode=OneWay}"
ButtonId="BINPOS56"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 56), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>56</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit55"
Grid.Column="11"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='55', Mode=OneWay}"
ButtonId="BINPOS55"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 55), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>55</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit54"
Grid.Column="12"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='54', Mode=OneWay}"
ButtonId="BINPOS54"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 54), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>54</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit53"
Grid.Column="13"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='53', Mode=OneWay}"
ButtonId="BINPOS53"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 53), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>53</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit52"
Grid.Column="14"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='52', Mode=OneWay}"
ButtonId="BINPOS52"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 52), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>52</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit51"
Grid.Column="16"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='51', Mode=OneWay}"
ButtonId="BINPOS51"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 51), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>51</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit50"
Grid.Column="17"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='50', Mode=OneWay}"
ButtonId="BINPOS50"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 50), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>50</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit49"
Grid.Column="18"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='49', Mode=OneWay}"
ButtonId="BINPOS49"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 49), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>49</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit48"
Grid.Column="19"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='48', Mode=OneWay}"
ButtonId="BINPOS48"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 48), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>48</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit47"
Grid.Row="2"
Grid.Column="1"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='47', Mode=OneWay}"
ButtonId="BINPOS47"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 47), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>47</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit46"
Grid.Row="2"
Grid.Column="2"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='46', Mode=OneWay}"
ButtonId="BINPOS46"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 46), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>46</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit45"
Grid.Row="2"
Grid.Column="3"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='45', Mode=OneWay}"
ButtonId="BINPOS45"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 45), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>45</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit44"
Grid.Row="2"
Grid.Column="4"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='44', Mode=OneWay}"
ButtonId="BINPOS44"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 44), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>44</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit43"
Grid.Row="2"
Grid.Column="6"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='43', Mode=OneWay}"
ButtonId="BINPOS43"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 43), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>43</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit42"
Grid.Row="2"
Grid.Column="7"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='42', Mode=OneWay}"
ButtonId="BINPOS42"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 42), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>42</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit41"
Grid.Row="2"
Grid.Column="8"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='41', Mode=OneWay}"
ButtonId="BINPOS41"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 41), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>41</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit40"
Grid.Row="2"
Grid.Column="9"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='40', Mode=OneWay}"
ButtonId="BINPOS40"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 40), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>40</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit39"
Grid.Row="2"
Grid.Column="11"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='39', Mode=OneWay}"
ButtonId="BINPOS39"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 39), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>39</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit38"
Grid.Row="2"
Grid.Column="12"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='38', Mode=OneWay}"
ButtonId="BINPOS38"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 38), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>38</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit37"
Grid.Row="2"
Grid.Column="13"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='37', Mode=OneWay}"
ButtonId="BINPOS37"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 37), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>37</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit36"
Grid.Row="2"
Grid.Column="14"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='36', Mode=OneWay}"
ButtonId="BINPOS36"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 36), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>36</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit35"
Grid.Row="2"
Grid.Column="16"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='35', Mode=OneWay}"
ButtonId="BINPOS35"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 35), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>35</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit34"
Grid.Row="2"
Grid.Column="17"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='34', Mode=OneWay}"
ButtonId="BINPOS34"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 34), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>34</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit33"
Grid.Row="2"
Grid.Column="18"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='33', Mode=OneWay}"
ButtonId="BINPOS33"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 33), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>33</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit32"
Grid.Row="2"
Grid.Column="19"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='32', Mode=OneWay}"
ButtonId="BINPOS32"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsQwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 32), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>32</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit31"
Grid.Row="4"
Grid.Column="1"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='31', Mode=OneWay}"
ButtonId="BINPOS31"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 31), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>31</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit30"
Grid.Row="4"
Grid.Column="2"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='30', Mode=OneWay}"
ButtonId="BINPOS30"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 30), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>30</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit29"
Grid.Row="4"
Grid.Column="3"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='29', Mode=OneWay}"
ButtonId="BINPOS29"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 29), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>29</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit28"
Grid.Row="4"
Grid.Column="4"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='28', Mode=OneWay}"
ButtonId="BINPOS28"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 28), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>28</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit27"
Grid.Row="4"
Grid.Column="6"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='27', Mode=OneWay}"
ButtonId="BINPOS27"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 27), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>27</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit26"
Grid.Row="4"
Grid.Column="7"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='26', Mode=OneWay}"
ButtonId="BINPOS26"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 26), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>26</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit25"
Grid.Row="4"
Grid.Column="8"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='25', Mode=OneWay}"
ButtonId="BINPOS25"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 25), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>25</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit24"
Grid.Row="4"
Grid.Column="9"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='24', Mode=OneWay}"
ButtonId="BINPOS24"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 24), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>24</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit23"
Grid.Row="4"
Grid.Column="11"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='23', Mode=OneWay}"
ButtonId="BINPOS23"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 23), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>23</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit22"
Grid.Row="4"
Grid.Column="12"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='22', Mode=OneWay}"
ButtonId="BINPOS22"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 22), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>22</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit21"
Grid.Row="4"
Grid.Column="13"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='21', Mode=OneWay}"
ButtonId="BINPOS21"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 21), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>21</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit20"
Grid.Row="4"
Grid.Column="14"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='20', Mode=OneWay}"
ButtonId="BINPOS20"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 20), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>20</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit19"
Grid.Row="4"
Grid.Column="16"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='19', Mode=OneWay}"
ButtonId="BINPOS19"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 19), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>19</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit18"
Grid.Row="4"
Grid.Column="17"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='18', Mode=OneWay}"
ButtonId="BINPOS18"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 18), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>18</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit17"
Grid.Row="4"
Grid.Column="18"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='17', Mode=OneWay}"
ButtonId="BINPOS17"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 17), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>17</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit16"
Grid.Row="4"
Grid.Column="19"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='16', Mode=OneWay}"
ButtonId="BINPOS16"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsDwordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 16), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>16</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit15"
Grid.Row="6"
Grid.Column="1"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='15', Mode=OneWay}"
ButtonId="BINPOS15"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsWordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 15), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>15</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit14"
Grid.Row="6"
Grid.Column="2"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='14', Mode=OneWay}"
ButtonId="BINPOS14"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsWordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 14), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>14</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit13"
Grid.Row="6"
Grid.Column="3"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='13', Mode=OneWay}"
ButtonId="BINPOS13"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsWordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 13), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>13</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit12"
Grid.Row="6"
Grid.Column="4"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='12', Mode=OneWay}"
ButtonId="BINPOS12"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsWordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 12), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>12</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit11"
Grid.Row="6"
Grid.Column="6"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='11', Mode=OneWay}"
ButtonId="BINPOS11"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsWordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 11), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>11</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit10"
Grid.Row="6"
Grid.Column="7"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='10', Mode=OneWay}"
ButtonId="BINPOS10"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsWordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 10), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>10</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit9"
Grid.Row="6"
Grid.Column="8"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='9', Mode=OneWay}"
ButtonId="BINPOS9"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsWordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 9), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>9</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit8"
Grid.Row="6"
Grid.Column="9"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='8', Mode=OneWay}"
ButtonId="BINPOS8"
Checked="OnBitToggled"
IsEnabled="{x:Bind Model.IsWordEnabled, Mode=OneWay}"
Unchecked="OnBitToggled"/>
IsEnabled="{x:Bind ShouldEnableBit(Model.ValueBitLength, 8), Mode=OneWay}"
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>8</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit7"
Grid.Row="6"
Grid.Column="11"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='7', Mode=OneWay}"
ButtonId="BINPOS7"
Checked="OnBitToggled"
Unchecked="OnBitToggled"/>
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>7</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit6"
Grid.Row="6"
Grid.Column="12"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='6', Mode=OneWay}"
ButtonId="BINPOS6"
Checked="OnBitToggled"
Unchecked="OnBitToggled"/>
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>6</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit5"
Grid.Row="6"
Grid.Column="13"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='5', Mode=OneWay}"
ButtonId="BINPOS5"
Checked="OnBitToggled"
Unchecked="OnBitToggled"/>
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>5</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit4"
Grid.Row="6"
Grid.Column="14"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='4', Mode=OneWay}"
ButtonId="BINPOS4"
Checked="OnBitToggled"
Unchecked="OnBitToggled"/>
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>4</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit3"
Grid.Row="6"
Grid.Column="16"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='3', Mode=OneWay}"
ButtonId="BINPOS3"
Checked="OnBitToggled"
Unchecked="OnBitToggled"/>
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>3</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit2"
Grid.Row="6"
Grid.Column="17"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='2', Mode=OneWay}"
ButtonId="BINPOS2"
Checked="OnBitToggled"
Unchecked="OnBitToggled"/>
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>2</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit1"
Grid.Row="6"
Grid.Column="18"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='1', Mode=OneWay}"
ButtonId="BINPOS1"
Checked="OnBitToggled"
Unchecked="OnBitToggled"/>
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>1</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
<controls:FlipButtons x:Name="Bit0"
Grid.Row="6"
Grid.Column="19"
Style="{StaticResource FlippingToggleButtonStyle}"
AutomationProperties.Name="{x:Bind Model.BinaryDisplayValue, Converter={StaticResource BitFlipAutomationNameConverter}, ConverterParameter='0', Mode=OneWay}"
ButtonId="BINPOS0"
Checked="OnBitToggled"
Unchecked="OnBitToggled"/>
Unchecked="OnBitToggled">
<controls:FlipButtons.Tag>
<x:Int32>0</x:Int32>
</controls:FlipButtons.Tag>
</controls:FlipButtons>
</Grid>
</UserControl>

View File

@@ -11,6 +11,8 @@
#include "CalcViewModel/Common/TraceLogger.h"
#include "CalcViewModel/Common/LocalizationSettings.h"
#include "Converters/BooleanToVisibilityConverter.h"
#include <CalcViewModel/Common/AppResourceProvider.h>
#include "CalcViewModel/Common/LocalizationStringUtil.h"
using namespace CalculatorApp;
using namespace CalculatorApp::Common;
@@ -19,6 +21,7 @@ using namespace CalculatorApp::ViewModel;
using namespace Platform;
using namespace std;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Automation;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
@@ -29,15 +32,11 @@ CalculatorProgrammerBitFlipPanel::CalculatorProgrammerBitFlipPanel()
: m_updatingCheckedStates(false)
{
InitializeComponent();
auto booleanToVisibilityConverter = ref new Converters::BooleanToVisibilityConverter;
SetVisibilityBinding(BitFlipPanel, L"IsBinaryBitFlippingEnabled", booleanToVisibilityConverter);
AssignFlipButtons();
}
void CalculatorProgrammerBitFlipPanel::OnLoaded(Object ^ sender, RoutedEventArgs ^ e)
{
UnsubscribePropertyChanged();
SubscribePropertyChanged();
}
@@ -51,8 +50,7 @@ void CalculatorProgrammerBitFlipPanel::SubscribePropertyChanged()
if (Model != nullptr)
{
m_propertyChangedToken = Model->PropertyChanged += ref new PropertyChangedEventHandler(this, &CalculatorProgrammerBitFlipPanel::OnPropertyChanged);
UpdateCheckedStates();
UpdateCheckedStates(true);
}
}
@@ -67,9 +65,19 @@ void CalculatorProgrammerBitFlipPanel::UnsubscribePropertyChanged()
void CalculatorProgrammerBitFlipPanel::OnPropertyChanged(Object ^ sender, PropertyChangedEventArgs ^ e)
{
if (e->PropertyName == StandardCalculatorViewModel::BinaryDisplayValuePropertyName)
if (e->PropertyName == StandardCalculatorViewModel::BinaryDigitsPropertyName)
{
UpdateCheckedStates();
UpdateCheckedStates(false);
}
else if (e->PropertyName == StandardCalculatorViewModel::IsBitFlipCheckedPropertyName
|| e->PropertyName == StandardCalculatorViewModel::IsProgrammerPropertyName)
{
if (Model->IsBitFlipChecked && Model->IsProgrammer)
{
// OnBitToggle won't update the automation properties when this control isn't displayed
// We need to update all automation properties names manually when the BitFlipPanel is displayed again
UpdateAutomationPropertiesNames();
}
}
}
@@ -148,14 +156,6 @@ void CalculatorProgrammerBitFlipPanel::AssignFlipButtons()
m_flipButtons[63] = this->Bit63;
}
void CalculatorProgrammerBitFlipPanel::SetVisibilityBinding(_In_ FrameworkElement ^ element, _In_ String ^ path, _In_ IValueConverter ^ converter)
{
Binding ^ commandBinding = ref new Binding();
commandBinding->Path = ref new PropertyPath(path);
commandBinding->Converter = converter;
element->SetBinding(VisibilityProperty, commandBinding);
}
void CalculatorProgrammerBitFlipPanel::OnBitToggled(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
{
if (m_updatingCheckedStates)
@@ -168,16 +168,16 @@ void CalculatorProgrammerBitFlipPanel::OnBitToggled(_In_ Object ^ sender, _In_ R
// Also, if the mode is switched to other Calculator modes when the BitFlip panel is open,
// a race condition exists in which the IsProgrammerMode property is still true and the UpdatePrimaryResult() is called,
// which continuously alters the Display Value and the state of the Bit Flip buttons.
if ((Model->IsBitFlipChecked) && Model->IsProgrammer)
if (Model->IsBitFlipChecked && Model->IsProgrammer)
{
TraceLogger::GetInstance().LogBitFlipUsed();
auto flipButton = static_cast<FlipButtons ^>(sender);
int index = static_cast<int>(flipButton->Tag);
flipButton->SetValue(AutomationProperties::NameProperty, GenerateAutomationPropertiesName(index, flipButton->IsChecked->Value));
Model->ButtonPressed->Execute(flipButton->ButtonId);
}
}
void CalculatorProgrammerBitFlipPanel::UpdateCheckedStates()
void CalculatorProgrammerBitFlipPanel::UpdateCheckedStates(bool updateAutomationPropertiesNames)
{
assert(!m_updatingCheckedStates);
assert(m_flipButtons.size() == s_numBits);
@@ -187,35 +187,57 @@ void CalculatorProgrammerBitFlipPanel::UpdateCheckedStates()
return;
}
static const wchar_t ch0 = LocalizationSettings::GetInstance().GetDigitSymbolFromEnUsDigit(L'0');
// Filter any unwanted characters from the displayed string.
static constexpr array<wchar_t, 4> unwantedChars = { L' ', Utils::LRE, Utils::PDF, Utils::LRO };
wstringstream stream;
wstring displayValue = Model->BinaryDisplayValue->Data();
for (const wchar_t& c : displayValue)
{
if (find(begin(unwantedChars), end(unwantedChars), c) == unwantedChars.end())
{
stream << c;
}
}
wstring rawDisplay = stream.str();
size_t paddingCount = s_numBits - rawDisplay.length();
wstring setBits = wstring(paddingCount, ch0) + rawDisplay;
assert(setBits.length() == s_numBits);
m_updatingCheckedStates = true;
for (unsigned int bitIndex = 0; bitIndex < s_numBits; bitIndex++)
auto it = m_flipButtons.begin();
int index = 0;
for (bool val : Model->BinaryDigits)
{
// Highest bit (64) is at index 0 in bit string.
// To get bit 0, grab from opposite end of string.
wchar_t bit = setBits[s_numBits - bitIndex - 1];
m_flipButtons[bitIndex]->IsChecked = (bit != ch0);
FlipButtons ^ flipButton = *it;
if (updateAutomationPropertiesNames)
{
flipButton->SetValue(AutomationProperties::NameProperty, GenerateAutomationPropertiesName(index, flipButton->IsChecked->Value));
}
flipButton->IsChecked = val;
++it;
++index;
}
m_updatingCheckedStates = false;
}
void CalculatorProgrammerBitFlipPanel::UpdateAutomationPropertiesNames()
{
for (FlipButtons ^ flipButton : m_flipButtons)
{
int index = static_cast<int>(flipButton->Tag);
flipButton->SetValue(AutomationProperties::NameProperty, GenerateAutomationPropertiesName(index, flipButton->IsChecked->Value));
}
}
bool CalculatorProgrammerBitFlipPanel::ShouldEnableBit(BitLength length, int index)
{
switch (length)
{
case BitLength::BitLengthQWord:
return index <= 63;
case BitLength::BitLengthDWord:
return index <= 31;
case BitLength::BitLengthWord:
return index <= 15;
case BitLength::BitLengthByte:
return index <= 7;
}
return false;
}
String ^ CalculatorProgrammerBitFlipPanel::GenerateAutomationPropertiesName(int position, bool value) const
{
auto resourceLoader = AppResourceProvider::GetInstance();
String ^ indexName = resourceLoader.GetResourceString(ref new Platform::String(to_wstring(position).c_str()));
String ^ automationNameTemplate = resourceLoader.GetResourceString(L"BitFlipItemAutomationName");
String ^ bitPositionTemplate = resourceLoader.GetResourceString(L"BitPosition");
wstring bitPosition = LocalizationStringUtil::GetLocalizedString(bitPositionTemplate->Data(), indexName->Data());
return ref new String(LocalizationStringUtil::GetLocalizedString(automationNameTemplate->Data(), bitPosition.c_str(), value ? L"1" : L"0").c_str());
}

View File

@@ -1,4 +1,4 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
//
@@ -10,9 +10,6 @@
#include "Views/CalculatorProgrammerBitFlipPanel.g.h"
#include "Controls/FlipButtons.h"
#include "Converters/BitFlipAutomationNameConverter.h"
#include "Converters/BooleanNegationConverter.h"
#include "Converters/VisibilityNegationConverter.h"
#include "CalcViewModel/StandardCalculatorViewModel.h"
namespace CalculatorApp
@@ -22,6 +19,8 @@ namespace CalculatorApp
public:
CalculatorProgrammerBitFlipPanel();
bool ShouldEnableBit(CalculatorApp::Common::BitLength length, int index);
property CalculatorApp::ViewModel::StandardCalculatorViewModel
^ Model { CalculatorApp::ViewModel::StandardCalculatorViewModel ^ get(); }
@@ -34,15 +33,13 @@ namespace CalculatorApp
void AssignFlipButtons();
void SetVisibilityBinding(
_In_ Windows::UI::Xaml::FrameworkElement ^ element,
_In_ Platform::String ^ path,
_In_ Windows::UI::Xaml::Data::IValueConverter ^ converter);
void OnBitToggled(_In_ Platform::Object ^ sender, _In_ Windows::UI::Xaml::RoutedEventArgs ^ e);
void UpdateCheckedStates();
private:
Windows::Foundation::EventRegistrationToken m_propertyChangedToken;
Platform::String ^ GenerateAutomationPropertiesName(int position, bool value) const;
void UpdateCheckedStates(bool updateAutomationPropertiesNames);
void UpdateAutomationPropertiesNames();
static const unsigned int s_numBits = 64;
std::array<CalculatorApp::Controls::FlipButtons ^, s_numBits> m_flipButtons;

View File

@@ -70,7 +70,6 @@
Grid.Column="1"
Style="{StaticResource ProgKeypadRadioButtonStyle}"
AutomationProperties.AutomationId="bitFlip"
Checked="ShowBitFlip"
Content="&#xf7d0;"
IsChecked="{x:Bind Model.IsBitFlipChecked, Mode=TwoWay}"/>
</Grid>

View File

@@ -6,6 +6,7 @@
#include "CalcViewModel/Common/TraceLogger.h"
using namespace CalculatorApp;
using namespace CalculatorApp::Common;
using namespace CalculatorApp::ViewModel;
using namespace Platform;
using namespace Windows::Foundation;
@@ -26,14 +27,8 @@ CalculatorProgrammerDisplayPanel::CalculatorProgrammerDisplayPanel()
InitializeComponent();
}
void CalculatorProgrammerDisplayPanel::ShowBitFlip(Object ^ sender, RoutedEventArgs ^ e)
{
TraceLogger::GetInstance().LogBitFlipPaneClicked();
}
void CalculatorProgrammerDisplayPanel::OnBitLengthButtonPressed(Object ^ parameter)
{
TraceLogger::GetInstance().LogBitLengthButtonUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()));
String ^ buttonId = parameter->ToString();
QwordButton->Visibility = ::Visibility::Collapsed;
@@ -42,42 +37,29 @@ void CalculatorProgrammerDisplayPanel::OnBitLengthButtonPressed(Object ^ paramet
ByteButton->Visibility = ::Visibility::Collapsed;
if (buttonId == "0")
{
Model->ButtonPressed->Execute(NumbersAndOperatorsEnum::Dword);
Model->ValueBitLength = BitLength::BitLengthDWord;
DwordButton->Visibility = ::Visibility::Visible;
DwordButton->Focus(::FocusState::Programmatic);
Model->IsQwordEnabled = false;
Model->IsDwordEnabled = true;
Model->IsWordEnabled = true;
}
else if (buttonId == "1")
{
Model->ButtonPressed->Execute(NumbersAndOperatorsEnum::Word);
Model->ValueBitLength = BitLength::BitLengthWord;
WordButton->Visibility = ::Visibility::Visible;
WordButton->Focus(::FocusState::Programmatic);
Model->IsQwordEnabled = false;
Model->IsDwordEnabled = false;
Model->IsWordEnabled = true;
}
else if (buttonId == "2")
{
Model->ButtonPressed->Execute(NumbersAndOperatorsEnum::Byte);
Model->ValueBitLength = BitLength::BitLengthByte;
ByteButton->Visibility = ::Visibility::Visible;
ByteButton->Focus(::FocusState::Programmatic);
Model->IsQwordEnabled = false;
Model->IsDwordEnabled = false;
Model->IsWordEnabled = false;
}
else if (buttonId == "3")
{
Model->ButtonPressed->Execute(NumbersAndOperatorsEnum::Qword);
Model->ValueBitLength = BitLength::BitLengthQWord;
QwordButton->Visibility = ::Visibility::Visible;
QwordButton->Focus(::FocusState::Programmatic);
Model->IsQwordEnabled = true;
Model->IsDwordEnabled = true;
Model->IsWordEnabled = true;
}
// update memory list according to bit length
Model->SetMemorizedNumbersString();
}
bool CalculatorProgrammerDisplayPanel::IsErrorVisualState::get()

View File

@@ -38,7 +38,7 @@ CalculatorProgrammerOperators::CalculatorProgrammerOperators()
void CalculatorProgrammerOperators::HexButtonChecked(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
{
TraceLogger::GetInstance().LogRadixButtonUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()));
TraceLogger::GetInstance().UpdateButtonUsage(NumbersAndOperatorsEnum::HexButton, ViewMode::Programmer);
if (Model)
{
Model->SwitchProgrammerModeBase(RADIX_TYPE::HEX_RADIX);
@@ -47,7 +47,7 @@ void CalculatorProgrammerOperators::HexButtonChecked(_In_ Object ^ sender, _In_
void CalculatorProgrammerOperators::DecButtonChecked(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
{
TraceLogger::GetInstance().LogRadixButtonUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()));
TraceLogger::GetInstance().UpdateButtonUsage(NumbersAndOperatorsEnum::DecButton, ViewMode::Programmer);
if (Model)
{
Model->SwitchProgrammerModeBase(RADIX_TYPE::DEC_RADIX);
@@ -56,7 +56,7 @@ void CalculatorProgrammerOperators::DecButtonChecked(_In_ Object ^ sender, _In_
void CalculatorProgrammerOperators::OctButtonChecked(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
{
TraceLogger::GetInstance().LogRadixButtonUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()));
TraceLogger::GetInstance().UpdateButtonUsage(NumbersAndOperatorsEnum::OctButton, ViewMode::Programmer);
if (Model)
{
Model->SwitchProgrammerModeBase(RADIX_TYPE::OCT_RADIX);
@@ -65,7 +65,7 @@ void CalculatorProgrammerOperators::OctButtonChecked(_In_ Object ^ sender, _In_
void CalculatorProgrammerOperators::BinButtonChecked(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
{
TraceLogger::GetInstance().LogRadixButtonUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()));
TraceLogger::GetInstance().UpdateButtonUsage(NumbersAndOperatorsEnum::BinButton, ViewMode::Programmer);
if (Model)
{
Model->SwitchProgrammerModeBase(RADIX_TYPE::BIN_RADIX);

View File

@@ -216,7 +216,7 @@
FontSize="16"
AutomationProperties.AutomationId="shiftButton"
Checked="Shift_Clicked"
Content="&#xE752;"
Content="&#xF897;"
Unchecked="Shift_Clicked"/>
<controls:CalculatorButton x:Name="ModButton"
x:Uid="modButton"
@@ -430,6 +430,6 @@
FontSize="12"
AutomationProperties.AutomationId="negateButton"
ButtonId="Negate"
Content="&#xE94D;"/>
Content="&#xF898;"/>
</Grid>
</UserControl>

View File

@@ -27,9 +27,6 @@ CalculatorProgrammerRadixOperators::CalculatorProgrammerRadixOperators()
: m_isErrorVisualState(false)
{
InitializeComponent();
auto booleanToVisibilityNegationConverter = ref new Converters::BooleanToVisibilityNegationConverter;
SetVisibilityBinding(ProgRadixOps, L"IsBinaryBitFlippingEnabled", booleanToVisibilityNegationConverter);
}
void CalculatorProgrammerRadixOperators::OnLoaded(Object ^, RoutedEventArgs ^)
@@ -70,14 +67,6 @@ void CalculatorProgrammerRadixOperators::Shift_Clicked(Platform::Object ^ sender
}
}
void CalculatorProgrammerRadixOperators::SetVisibilityBinding(FrameworkElement ^ element, String ^ path, IValueConverter ^ converter)
{
Binding ^ commandBinding = ref new Binding();
commandBinding->Path = ref new PropertyPath(path);
commandBinding->Converter = converter;
element->SetBinding(VisibilityProperty, commandBinding);
}
void CalculatorProgrammerRadixOperators::ProgModeRadixChange()
{
NumberPad->ProgModeRadixChange();

View File

@@ -32,7 +32,6 @@ namespace CalculatorApp
private:
void Shift_Clicked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
void SetVisibilityBinding(Windows::UI::Xaml::FrameworkElement ^ element, Platform::String ^ path, Windows::UI::Xaml::Data::IValueConverter ^ converter);
void OnLoaded(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
void OnUnloaded(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
void ProgModeRadixChange();

View File

@@ -37,7 +37,6 @@ CalculatorScientificAngleButtons::CalculatorScientificAngleButtons()
void CalculatorScientificAngleButtons::HypButton_Toggled(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
{
TraceLogger::GetInstance().LogHypButtonUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()));
}
void CalculatorScientificAngleButtons::FToEButton_Toggled(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
@@ -48,7 +47,6 @@ void CalculatorScientificAngleButtons::FToEButton_Toggled(_In_ Object ^ sender,
void CalculatorApp::CalculatorScientificAngleButtons::OnAngleButtonPressed(_In_ Object ^ commandParameter)
{
TraceLogger::GetInstance().LogAngleButtonUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()));
String ^ buttonId = static_cast<String ^>(commandParameter);
DegreeButton->Visibility = ::Visibility::Collapsed;

View File

@@ -511,7 +511,7 @@
Style="{StaticResource SymbolOperatorButtonStyle}"
AutomationProperties.AutomationId="squareRootButton"
ButtonId="Sqrt"
Content="&#xE94B;"/>
Content="&#xF899;"/>
<controls:CalculatorButton x:Name="PowerOf10Button"
x:Uid="powerOf10Button"
Grid.Column="1"
@@ -600,7 +600,7 @@
FontSize="20"
AutomationProperties.AutomationId="shiftButton"
Checked="shiftButton_Check"
Content="&#xE752;"
Content="&#xF897;"
IsEnabled="{x:Bind IsShiftEnabled(IsWideLayout, IsErrorVisualState), Mode=OneWay}"
IsEnabledChanged="shiftButton_IsEnabledChanged"
Unchecked="shiftButton_Check"/>
@@ -718,7 +718,7 @@
FontSize="16"
AutomationProperties.AutomationId="negateButton"
ButtonId="Negate"
Content="&#xE94D;"
Content="&#xF898;"
IsEnabled="{x:Bind Model.IsNegateEnabled, Mode=OneWay}"/>
<controls:CalculatorButton x:Name="OpenParenthesisButton"
x:Uid="openParenthesisButton"

View File

@@ -46,6 +46,60 @@
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup>
<VisualState x:Name="NormalFontSize">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowHeight="440" MinWindowWidth="0"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PercentButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="SquareRootButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="XPower2Button.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="InvertButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="NegateButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="ClearEntryButton.Style" Value="{StaticResource OperatorButtonStyle}"/>
<Setter Target="ClearButton.Style" Value="{StaticResource OperatorButtonStyle}"/>
<Setter Target="BackSpaceButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="DivideButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="MultiplyButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="MinusButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="PlusButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="EqualButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="NumberPad.ButtonStyle" Value="{StaticResource NumericButtonStyle24}"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="SmallFontSize">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowHeight="260" MinWindowWidth="0"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="NumberPad.ButtonStyle" Value="{StaticResource NumericButtonStyle18}"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="TinyFontSize">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowHeight="0" MinWindowWidth="0"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PercentButton.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="SquareRootButton.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="XPower2Button.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="InvertButton.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="NegateButton.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="ClearEntryButton.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="ClearButton.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="BackSpaceButton.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="DivideButton.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="MultiplyButton.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="MinusButton.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="PlusButton.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="EqualButton.FontSize" Value="{StaticResource CalcStandardOperatorCaptionSizeTiny}"/>
<Setter Target="NumberPad.ButtonStyle" Value="{StaticResource NumericButtonStyle12}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup>
<VisualState x:Name="Portrait768x1366">
<VisualState.StateTriggers>
@@ -238,11 +292,41 @@
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowHeight="{StaticResource AppMinWindowHeight}" MinWindowWidth="{StaticResource AppMinWindowWidth}"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PercentButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="SquareRootButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="XPower2Button.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="InvertButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="NegateButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="ClearEntryButton.Style" Value="{StaticResource OperatorButtonStyle}"/>
<Setter Target="ClearButton.Style" Value="{StaticResource OperatorButtonStyle}"/>
<Setter Target="BackSpaceButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="DivideButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="MultiplyButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="MinusButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="PlusButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="EqualButton.Style" Value="{StaticResource SymbolOperatorButtonStyle}"/>
<Setter Target="NumberPad.ButtonStyle" Value="{StaticResource NumericButtonStyle24}"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="ShowStandardFunctions">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowHeight="394" MinWindowWidth="0"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="R0.Height" Value="1*"/>
<Setter Target="StandardFunctions.Visibility" Value="Visible"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="DefaultLayout">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowHeight="0" MinWindowWidth="0"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="R0.Height" Value="0*"/>
<Setter Target="StandardFunctions.Visibility" Value="Collapsed"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
@@ -279,7 +363,7 @@
Style="{StaticResource SymbolOperatorButtonStyle}"
AutomationProperties.AutomationId="squareRootButton"
ButtonId="Sqrt"
Content="&#xE94B;"/>
Content="&#xF899;"/>
<controls:CalculatorButton x:Name="XPower2Button"
x:Uid="xpower2Button"
Grid.Column="2"
@@ -410,6 +494,6 @@
Style="{StaticResource SymbolOperatorButtonStyle}"
AutomationProperties.AutomationId="negateButton"
ButtonId="Negate"
Content="&#xE94D;"/>
Content="&#xF898;"/>
</Grid>
</UserControl>

View File

@@ -1,4 +1,4 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
//

View File

@@ -1,4 +1,4 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
//

View File

@@ -358,7 +358,7 @@
</Grid.RowDefinitions>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualStateGroup CurrentStateChanged="OnVisualStateChanged">
<VisualState x:Name="LeftAlignedLayout">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="480"/>

View File

@@ -103,7 +103,7 @@ void DateCalculator::FromDate_DateChanged(_In_ CalendarDatePicker ^ sender, _In_
{
auto dateCalcViewModel = safe_cast<DateCalculatorViewModel ^>(this->DataContext);
dateCalcViewModel->FromDate = e->NewDate->Value;
TraceLogger::GetInstance().LogDateDifferenceModeUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()));
TraceLogger::GetInstance().LogDateCalculationModeUsed(false /* AddSubtractMode */);
}
else
{
@@ -117,7 +117,7 @@ void DateCalculator::ToDate_DateChanged(_In_ CalendarDatePicker ^ sender, _In_ C
{
auto dateCalcViewModel = safe_cast<DateCalculatorViewModel ^>(this->DataContext);
dateCalcViewModel->ToDate = e->NewDate->Value;
TraceLogger::GetInstance().LogDateDifferenceModeUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()));
TraceLogger::GetInstance().LogDateCalculationModeUsed(false /* AddSubtractMode */);
}
else
{
@@ -131,8 +131,7 @@ void DateCalculator::AddSubtract_DateChanged(_In_ CalendarDatePicker ^ sender, _
{
auto dateCalcViewModel = safe_cast<DateCalculatorViewModel ^>(this->DataContext);
dateCalcViewModel->StartDate = e->NewDate->Value;
TraceLogger::GetInstance().LogDateAddSubtractModeUsed(
ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()), dateCalcViewModel->IsAddMode);
TraceLogger::GetInstance().LogDateCalculationModeUsed(true /* AddSubtractMode */);
}
else
{
@@ -143,8 +142,11 @@ void DateCalculator::AddSubtract_DateChanged(_In_ CalendarDatePicker ^ sender, _
void CalculatorApp::DateCalculator::OffsetValue_Changed(_In_ Platform::Object ^ sender, _In_ SelectionChangedEventArgs ^ e)
{
auto dateCalcViewModel = safe_cast<DateCalculatorViewModel ^>(this->DataContext);
TraceLogger::GetInstance().LogDateAddSubtractModeUsed(
ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()), dateCalcViewModel->IsAddMode);
// do not log diagnostics for no-ops and initialization of combo boxes
if (dateCalcViewModel->DaysOffset != 0 || dateCalcViewModel->MonthsOffset != 0 || dateCalcViewModel->YearsOffset != 0)
{
TraceLogger::GetInstance().LogDateCalculationModeUsed(true /* AddSubtractMode */);
}
}
void DateCalculator::OnCopyMenuItemClicked(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
@@ -232,3 +234,9 @@ void DateCalculator::AddSubtractOption_Checked(_In_ Object ^ sender, _In_ Routed
{
RaiseLiveRegionChangedAutomationEvent(/* DateDiff mode */ false);
}
void CalculatorApp::DateCalculator::OnVisualStateChanged(Platform::Object ^ sender, Windows::UI::Xaml::VisualStateChangedEventArgs ^ e)
{
auto state = std::wstring(e->NewState->Name->Begin());
TraceLogger::GetInstance().LogVisualStateChanged(ViewMode::Date, state);
}

View File

@@ -48,7 +48,9 @@ namespace CalculatorApp
void OffsetDropDownClosed(_In_ Platform::Object ^ sender, _In_ Platform::Object ^ e);
void CalendarFlyoutClosed(_In_ Platform::Object ^ sender, _In_ Platform::Object ^ e);
void RaiseLiveRegionChangedAutomationEvent(_In_ bool isDateDiffMode);
void OnVisualStateChanged(Platform::Object ^ sender, Windows::UI::Xaml::VisualStateChangedEventArgs ^ e);
Windows::Foundation::EventRegistrationToken m_dateCalcOptionChangedEventToken;
};
}

View File

@@ -166,7 +166,7 @@ void GraphingCalculator::OnDataRequested(DataTransferManager^ sender, DataReques
}
catch(Exception ^ ex)
{
TraceLogger::GetInstance().LogPlatformException(__FUNCTIONW__, ex);
TraceLogger::GetInstance().LogPlatformException(ViewMode::Graphing, __FUNCTIONW__, ex);
// Something went wrong, notify the user.
auto errorTitleString = resourceLoader->GetString(L"ShareActionErrorMessage");

View File

@@ -49,7 +49,7 @@
Invoked="OnDeleteSwipeInvoked"/>
</muxc:SwipeItems>
<MenuFlyout x:Key="HistoryContextMenu">
<MenuFlyout x:Name="HistoryContextMenu">
<MenuFlyoutItem x:Uid="DeleteHistoryMenuItem"
Click="OnDeleteMenuItemClicked"
Icon="Delete"/>
@@ -57,9 +57,7 @@
<DataTemplate x:Key="HistoryItemTemplate" x:DataType="model:HistoryItemViewModel">
<muxc:SwipeControl RightItems="{StaticResource HistorySwipeItems}">
<StackPanel Margin="0,6,4,6"
Background="Transparent"
ContextFlyout="{StaticResource HistoryContextMenu}">
<StackPanel Margin="0,6,4,6" Background="Transparent">
<TextBlock x:Name="ExprTextBlock"
Margin="0,0,0,4"
HorizontalAlignment="Right"
@@ -85,6 +83,7 @@
BasedOn="{StaticResource HistoryMemoryItemContainerStyle}"
TargetType="ListViewItem">
<Setter Property="Margin" Value="0,0,0,20"/>
<Setter Property="ContextFlyout" Value="{StaticResource HistoryContextMenu}"/>
</Style>
</ResourceDictionary>
</UserControl.Resources>

View File

@@ -42,11 +42,11 @@ HistoryList::HistoryList()
void HistoryList::ListView_ItemClick(_In_ Object ^ sender, _In_ ItemClickEventArgs ^ e)
{
HistoryViewModel ^ historyVM = static_cast<HistoryViewModel ^>(this->DataContext);
HistoryItemViewModel ^ clickedItem = safe_cast<HistoryItemViewModel ^>(e->ClickedItem);
HistoryViewModel^ historyVM = dynamic_cast<HistoryViewModel ^>(this->DataContext);
HistoryItemViewModel^ clickedItem = dynamic_cast<HistoryItemViewModel ^>(e->ClickedItem);
// When the user clears the history list in the overlay view and presses enter, the clickedItem is nullptr
if (clickedItem != nullptr)
if (clickedItem != nullptr && historyVM != nullptr)
{
historyVM->ShowItem(clickedItem);
}
@@ -54,16 +54,21 @@ void HistoryList::ListView_ItemClick(_In_ Object ^ sender, _In_ ItemClickEventAr
void HistoryList::OnDeleteMenuItemClicked(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
{
auto clickedItem = safe_cast<HistoryItemViewModel ^>(safe_cast<FrameworkElement ^>(sender)->DataContext);
Model->DeleteItem(clickedItem);
auto listViewItem = HistoryContextMenu->Target;
auto itemViewModel = dynamic_cast<HistoryItemViewModel ^>(HistoryListView->ItemFromContainer(listViewItem));
if (itemViewModel != nullptr)
{
Model->DeleteItem(itemViewModel);
}
}
void HistoryList::OnDeleteSwipeInvoked(_In_ MUXC::SwipeItem ^ sender, _In_ MUXC::SwipeItemInvokedEventArgs ^ e)
{
auto swipedItem = safe_cast<HistoryItemViewModel ^>(e->SwipeControl->DataContext);
Model->DeleteItem(swipedItem);
auto swipedItem = dynamic_cast<HistoryItemViewModel ^>(e->SwipeControl->DataContext);
if (swipedItem != nullptr)
{
Model->DeleteItem(swipedItem);
}
}
void HistoryList::ScrollToBottom()

View File

@@ -32,6 +32,9 @@
<Style x:Key="NavViewItemStyle" TargetType="muxc:NavigationViewItem">
<Setter Property="KeyTipPlacementMode" Value="Right"/>
</Style>
<converters:BooleanToVisibilityNegationConverter x:Key="BooleanToVisibilityNegationConverter"/>
<converters:BooleanNegationConverter x:Key="BooleanNegationConverter"/>
</Page.Resources>
<Grid>
@@ -83,7 +86,23 @@
Command="{x:Bind Model.PasteCommand}"/>
</StackPanel>
<local:TitleBar x:Name="CustomTitleBar" Grid.Row="0"/>
<local:TitleBar Grid.Row="0" IsAlwaysOnTopMode="{x:Bind Model.IsAlwaysOnTop, Mode=OneWay}"
AlwaysOnTopClick="TitleBarAlwaysOnTopButtonClick"/>
<Grid Grid.Row="1">
<Border x:Name="CalcHolder">
<!-- PLACEHOLDER!!!! This is where the calculator goes when it is delay loaded -->
</Border>
<Border x:Name="DateCalcHolder">
<!-- PLACEHOLDER!!!! This is where the date calculator goes when it is delay loaded -->
</Border>
<Border x:Name="GraphingCalcHolder" Grid.Row="1">
<!-- PLACEHOLDER!!!! This is where the graphing calculator goes when it is delay loaded -->
</Border>
<Border x:Name="ConverterHolder">
<!-- PLACEHOLDER!!!! This is where the converter goes when it is delay loaded -->
</Border>
</Grid>
<muxc:NavigationView x:Name="NavView"
x:Uid="NavView"
@@ -92,7 +111,10 @@
DataContext="{x:Bind Model}"
ExpandedModeThresholdWidth="Infinity"
IsBackButtonVisible="Collapsed"
IsEnabled="{x:Bind Model.IsAlwaysOnTop, Converter={StaticResource BooleanNegationConverter}, Mode=OneWay}"
IsPaneToggleButtonVisible="{x:Bind Model.IsAlwaysOnTop, Converter={StaticResource BooleanNegationConverter}, Mode=OneWay}"
IsSettingsVisible="False"
ItemInvoked="OnNavItemInvoked"
Loaded="OnNavLoaded"
MenuItemsSource="{x:Bind CreateUIElementsForCategories(Model.Categories), Mode=OneWay}"
OpenPaneLength="{StaticResource SplitViewOpenPaneLength}"
@@ -100,9 +122,9 @@
PaneOpened="OnNavPaneOpened"
PaneOpening="OnNavPaneOpening"
SelectionChanged="OnNavSelectionChanged"
ItemInvoked="OnNavItemInvoked"
TabIndex="1"
UseSystemFocusVisuals="True">
<muxc:NavigationView.PaneFooter>
<StackPanel HorizontalAlignment="Stretch" Orientation="Vertical">
<muxc:NavigationViewList x:Name="NavFooter"
@@ -135,27 +157,31 @@
</muxc:NavigationViewList>
</StackPanel>
</muxc:NavigationView.PaneFooter>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="Header"
Grid.Column="0"
Margin="52,6,12,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{x:Bind Model.CategoryName, Mode=OneWay}"/>
<Border x:Name="CalcHolder">
<!-- PLACEHOLDER!!!! This is where the calculator goes when it is delay loaded -->
</Border>
<Border x:Name="DateCalcHolder">
<!-- PLACEHOLDER!!!! This is where the date calculator goes when it is delay loaded -->
</Border>
<Border x:Name="GraphingCalcHolder" Grid.Row="1">
<!-- PLACEHOLDER!!!! This is where the graphing calculator goes when it is delay loaded -->
</Border>
<Border x:Name="ConverterHolder">
<!-- PLACEHOLDER!!!! This is where the converter goes when it is delay loaded -->
</Border>
Text="{x:Bind Model.CategoryName, Mode=OneWay}"
Visibility="{x:Bind Model.IsAlwaysOnTop, Converter={StaticResource BooleanToVisibilityNegationConverter}, Mode=OneWay}"/>
<Button x:Name="NormalAlwaysOnTopButton"
x:Uid="EnterAlwaysOnTopButton"
Grid.Column="1"
VerticalAlignment="Top"
HorizontalContentAlignment="Center"
Style="{StaticResource SquareIconButtonStyle}"
Background="Transparent"
FontFamily="{StaticResource CalculatorFontFamily}"
AutomationProperties.AutomationId="NormalAlwaysOnTopButton"
Click="AlwaysOnTopButtonClick"
Content="&#xEE49;"
Visibility="{x:Bind Model.DisplayNormalAlwaysOnTopOption, Mode=OneWay}"/>
</Grid>
</muxc:NavigationView>
</Grid>

View File

@@ -70,7 +70,9 @@ MainPage::MainPage()
KeyboardShortcutManager::Initialize();
Application::Current->Suspending += ref new SuspendingEventHandler(this, &MainPage::App_Suspending);
m_model->PropertyChanged += ref new PropertyChangedEventHandler(this, &MainPage::OnAppPropertyChanged);
m_accessibilitySettings = ref new AccessibilitySettings();
double sizeInInches = 0.0;
@@ -196,11 +198,11 @@ void MainPage::OnAppPropertyChanged(_In_ Platform::Object ^ sender, _In_ Windows
void MainPage::ShowHideControls(ViewMode mode)
{
bool isCalcViewMode = NavCategory::IsCalculatorViewMode(mode);
bool isDateCalcViewMode = NavCategory::IsDateCalculatorViewMode(mode);
bool isGraphingCalcViewMode = NavCategory::IsGraphingCalculatorViewMode(mode);
bool isConverterViewMode = NavCategory::IsConverterViewMode(mode);
auto isCalcViewMode = NavCategory::IsCalculatorViewMode(mode);
auto isDateCalcViewMode = NavCategory::IsDateCalculatorViewMode(mode);
auto isGraphingCalcViewMode = NavCategory::IsGraphingCalculatorViewMode(mode);
auto isConverterViewMode = NavCategory::IsConverterViewMode(mode);
if (m_calculator)
{
m_calculator->Visibility = BooleanToVisibilityConverter::Convert(isCalcViewMode);
@@ -254,6 +256,8 @@ void MainPage::OnPageLoaded(_In_ Object ^, _In_ RoutedEventArgs ^ args)
}
m_windowSizeEventToken = Window::Current->SizeChanged += ref new WindowSizeChangedEventHandler(this, &MainPage::WindowSizeChanged);
m_accessibilitySettingsToken = m_accessibilitySettings->HighContrastChanged +=
ref new Windows::Foundation::TypedEventHandler<AccessibilitySettings ^, Object ^>(this, &CalculatorApp::MainPage::OnHighContrastChanged);
UpdateViewState();
SetHeaderAutomationName();
@@ -262,15 +266,23 @@ void MainPage::OnPageLoaded(_In_ Object ^, _In_ RoutedEventArgs ^ args)
// Delay load things later when we get a chance.
this->Dispatcher->RunAsync(
CoreDispatcherPriority::Normal, ref new DispatchedHandler([]() {
if (TraceLogger::GetInstance().UpdateWindowIdLog(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread())))
if (TraceLogger::GetInstance().IsWindowIdInLog(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread())))
{
TraceLogger::GetInstance().LogAppLaunchComplete();
AppLifecycleLogger::GetInstance().LaunchUIResponsive();
AppLifecycleLogger::GetInstance().LaunchVisibleComplete();
}
}));
}
void MainPage::OnHighContrastChanged(_In_ AccessibilitySettings ^ /*sender*/, _In_ Object ^ /*args*/)
{
if (Model->IsAlwaysOnTop && this->ActualHeight < 394)
{
// Sets to default always-on-top size to force re-layout
ApplicationView::GetForCurrentView()->TryResizeView(Size(320, 394));
}
}
void MainPage::SetDefaultFocus()
{
if (m_calculator != nullptr && m_calculator->Visibility == ::Visibility::Visible)
@@ -308,13 +320,16 @@ void MainPage::EnsureCalculator()
Binding ^ isProgramerBinding = ref new Binding();
isProgramerBinding->Path = ref new PropertyPath(L"IsProgrammer");
m_calculator->SetBinding(m_calculator->IsProgrammerProperty, isProgramerBinding);
Binding ^ isAlwaysOnTopBinding = ref new Binding();
isAlwaysOnTopBinding->Path = ref new PropertyPath(L"IsAlwaysOnTop");
m_calculator->SetBinding(m_calculator->IsAlwaysOnTopProperty, isAlwaysOnTopBinding);
m_calculator->Style = CalculatorBaseStyle;
CalcHolder->Child = m_calculator;
// Calculator's "default" state is visible, but if we get delay loaded
// when in converter, we should not be visible. This is not a problem for converter
// since it's default state is hidden.
// since its default state is hidden.
ShowHideControls(this->Model->Mode);
}
@@ -505,6 +520,8 @@ void MainPage::UnregisterEventHandlers()
{
Window::Current->SizeChanged -= m_windowSizeEventToken;
m_windowSizeEventToken.Value = 0;
m_accessibilitySettings->HighContrastChanged -= m_accessibilitySettingsToken;
m_accessibilitySettingsToken.Value = 0;
if (m_calculator != nullptr)
{
@@ -535,7 +552,6 @@ void MainPage::SetHeaderAutomationName()
}
string::size_type found = full.find(L"%1");
assert(found != wstring::npos);
wstring strMode = m_model->CategoryName->Data();
full = full.replace(found, 2, strMode);
@@ -556,3 +572,24 @@ void MainPage::OnNavItemInvoked(MUXC::NavigationView ^ /*sender*/, _In_ MUXC::Na
{
NavView->IsPaneOpen = false;
}
void MainPage::TitleBarAlwaysOnTopButtonClick(_In_ Object ^ /*sender*/, _In_ RoutedEventArgs ^ /*e*/)
{
auto bounds = Window::Current->Bounds;
Model->ToggleAlwaysOnTop(bounds.Width, bounds.Height);
}
void MainPage::AlwaysOnTopButtonClick(_In_ Object ^ /*sender*/, _In_ RoutedEventArgs ^ /*e*/)
{
Model->ToggleAlwaysOnTop(0, 0);
}
void MainPage::App_Suspending(Object ^ sender, Windows::ApplicationModel::SuspendingEventArgs ^ e)
{
if (m_model->IsAlwaysOnTop)
{
ApplicationDataContainer ^ localSettings = ApplicationData::Current->LocalSettings;
localSettings->Values->Insert(ApplicationViewModel::WidthLocalSettings, this->ActualWidth);
localSettings->Values->Insert(ApplicationViewModel::HeightLocalSettings, this->ActualHeight);
}
}

View File

@@ -57,6 +57,8 @@ public
void OnAboutButtonClick(_In_ Platform::Object ^ sender, _In_ Windows::UI::Xaml::Controls::ItemClickEventArgs ^ e);
void OnAboutFlyoutOpened(_In_ Platform::Object ^ sender, _In_ Platform::Object ^ e);
void OnAboutFlyoutClosed(_In_ Platform::Object ^ sender, _In_ Platform::Object ^ e);
void AlwaysOnTopButtonClick(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
void TitleBarAlwaysOnTopButtonClick(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
Microsoft::UI::Xaml::Controls::NavigationViewItemHeader ^ CreateNavViewHeaderFromGroup(CalculatorApp::Common::NavCategoryGroup ^ group);
Microsoft::UI::Xaml::Controls::NavigationViewItem ^ CreateNavViewItemFromCategory(CalculatorApp::Common::NavCategory ^ category);
@@ -64,8 +66,10 @@ public
void ShowHideControls(CalculatorApp::Common::ViewMode mode);
void UpdateViewState();
void UpdatePanelViewState();
void OnHighContrastChanged(Windows::UI::ViewManagement::AccessibilitySettings ^ sender, Platform::Object ^ args);
void OnPageLoaded(_In_ Platform::Object ^ sender, _In_ Windows::UI::Xaml::RoutedEventArgs ^ e);
void App_Suspending(Object ^ sender, Windows::ApplicationModel::SuspendingEventArgs ^ e);
void EnsureCalculator();
void EnsureDateCalculator();
@@ -75,14 +79,13 @@ public
void AnnounceCategoryName();
Calculator^ m_calculator;
GraphingCalculator^ m_graphingCalculator;
UnitConverter^ m_converter;
DateCalculator^ m_dateCalculator;
Windows::Foundation::EventRegistrationToken _windowSizeEventToken;
Windows::Foundation::EventRegistrationToken m_hardwareButtonsBackPressedToken;
Windows::Foundation::EventRegistrationToken m_colorValuesChangedToken;
CalculatorApp::Calculator ^ m_calculator;
CalculatorApp::UnitConverter ^ m_converter;
CalculatorApp::DateCalculator ^ m_dateCalculator;
CalculatorApp::GraphingCalculator^ m_graphingCalculator;
Windows::Foundation::EventRegistrationToken m_windowSizeEventToken;
ViewModel::ApplicationViewModel^ m_model;
CalculatorApp::ViewModel::ApplicationViewModel ^ m_model;
Windows::Foundation::EventRegistrationToken m_accessibilitySettingsToken;
Windows::UI::ViewManagement::AccessibilitySettings ^ m_accessibilitySettings;
};
}

View File

@@ -17,7 +17,7 @@
<converters:BooleanToVisibilityNegationConverter x:Key="BooleanToVisibilityNegationConverter"/>
<converters:BooleanNegationConverter x:Key="BooleanNegationConverter"/>
<MenuFlyout x:Key="MemoryContextMenu">
<MenuFlyout x:Name="MemoryContextMenu">
<MenuFlyoutItem x:Uid="ClearMemoryMenuItem" Click="OnClearMenuItemClicked">
<MenuFlyoutItem.Icon>
<FontIcon FontFamily="{StaticResource CalculatorFontFamily}" Glyph="&#xf754;"/>
@@ -42,6 +42,7 @@
BasedOn="{StaticResource HistoryMemoryItemContainerStyle}"
TargetType="ListViewItem">
<Setter Property="Margin" Value="0,0,0,8"/>
<Setter Property="ContextFlyout" Value="{StaticResource MemoryContextMenu}"/>
</Style>
</UserControl.Resources>
@@ -103,8 +104,6 @@
<ListView x:Name="MemoryListView"
Padding="0,12,0,0"
HorizontalAlignment="Stretch"
ContextCanceled="OnContextCanceled"
ContextRequested="OnContextRequested"
IsItemClickEnabled="true"
ItemClick="MemoryListItemClick"
ItemContainerStyle="{ThemeResource MemoryItemContainerStyle}"

View File

@@ -39,7 +39,6 @@ Memory::Memory()
: m_isErrorVisualState(false)
{
InitializeComponent();
m_memoryItemFlyout = safe_cast<MenuFlyout ^>(Resources->Lookup("MemoryContextMenu"));
MemoryPaneEmpty->FlowDirection = LocalizationService::GetInstance()->GetFlowDirection();
}
@@ -56,53 +55,31 @@ void Memory::MemoryListItemClick(_In_ Object ^ sender, _In_ ItemClickEventArgs ^
}
}
void Memory::OnContextRequested(Windows::UI::Xaml::UIElement ^ sender, Windows::UI::Xaml::Input::ContextRequestedEventArgs ^ e)
{
// Walk up the tree to find the ListViewItem.
// There may not be one if the click wasn't on an item.
auto requestedElement = safe_cast<FrameworkElement ^>(e->OriginalSource);
while ((requestedElement != sender) && !dynamic_cast<ListViewItem ^>(requestedElement))
{
requestedElement = safe_cast<FrameworkElement ^>(VisualTreeHelper::GetParent(requestedElement));
}
if (requestedElement != sender)
{
// The context menu request was for a ListViewItem.
auto memorySlot = safe_cast<MemoryItemViewModel ^>(MemoryListView->ItemFromContainer(requestedElement));
Point point;
if (e->TryGetPosition(requestedElement, &point))
{
m_memoryItemFlyout->ShowAt(requestedElement, point);
}
else
{
// Not invoked via pointer, so let XAML choose a default location.
m_memoryItemFlyout->ShowAt(requestedElement);
}
e->Handled = true;
}
}
void Memory::OnContextCanceled(Windows::UI::Xaml::UIElement ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e)
{
m_memoryItemFlyout->Hide();
}
void Memory::OnClearMenuItemClicked(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
{
GetMemoryItemForCurrentFlyout()->Clear();
auto memoryItem = GetMemoryItemForCurrentFlyout();
if (memoryItem != nullptr)
{
memoryItem->Clear();
}
}
void Memory::OnMemoryAddMenuItemClicked(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
{
GetMemoryItemForCurrentFlyout()->MemoryAdd();
auto memoryItem = GetMemoryItemForCurrentFlyout();
if (memoryItem != nullptr)
{
memoryItem->MemoryAdd();
}
}
void Memory::OnMemorySubtractMenuItemClicked(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
{
GetMemoryItemForCurrentFlyout()->MemorySubtract();
auto memoryItem = GetMemoryItemForCurrentFlyout();
if (memoryItem != nullptr)
{
memoryItem->MemorySubtract();
}
}
bool Memory::IsErrorVisualState::get()
@@ -122,7 +99,6 @@ void Memory::IsErrorVisualState::set(bool value)
MemoryItemViewModel ^ Memory::GetMemoryItemForCurrentFlyout()
{
auto listViewItem = m_memoryItemFlyout->Target;
return safe_cast<MemoryItemViewModel ^>(MemoryListView->ItemFromContainer(listViewItem));
auto listViewItem = MemoryContextMenu->Target;
return dynamic_cast<MemoryItemViewModel ^>(MemoryListView->ItemFromContainer(listViewItem));
}

View File

@@ -36,14 +36,11 @@ namespace CalculatorApp
}
private:
Windows::UI::Xaml::Controls::MenuFlyout ^ m_memoryItemFlyout;
Windows::Foundation::Rect m_visibleBounds;
Windows::Foundation::Rect m_coreBounds;
bool m_isErrorVisualState;
void MemoryListItemClick(_In_ Platform::Object ^ sender, _In_ Windows::UI::Xaml::Controls::ItemClickEventArgs ^ e);
void OnContextRequested(Windows::UI::Xaml::UIElement ^ sender, Windows::UI::Xaml::Input::ContextRequestedEventArgs ^ e);
void OnContextCanceled(Windows::UI::Xaml::UIElement ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
void OnClearMenuItemClicked(_In_ Platform::Object ^ sender, _In_ Windows::UI::Xaml::RoutedEventArgs ^ e);
void OnMemoryAddMenuItemClicked(_In_ Platform::Object ^ sender, _In_ Windows::UI::Xaml::RoutedEventArgs ^ e);
void OnMemorySubtractMenuItemClicked(_In_ Platform::Object ^ sender, _In_ Windows::UI::Xaml::RoutedEventArgs ^ e);

View File

@@ -1,15 +1,12 @@
<UserControl x:Class="CalculatorApp.OperatorsPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:common="using:CalculatorApp.Common"
xmlns:controls="using:CalculatorApp.Controls"
xmlns:converters="using:CalculatorApp.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:CalculatorApp"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
UseLayoutRounding="False"
d:DesignHeight="315"
d:DesignWidth="235"
UseLayoutRounding="False"
mc:Ignorable="d">
<Grid>
<local:CalculatorStandardOperators x:Name="StandardOperators"
@@ -25,14 +22,12 @@
<local:CalculatorProgrammerBitFlipPanel x:Name="BitFlipPanel"
x:Load="False"
IsEnabled="{x:Bind Model.IsBinaryBitFlippingEnabled, Mode=OneWay}"
Visibility="{x:Bind IsBitFlipChecked, Mode=OneWay}"/>
Visibility="{x:Bind Model.IsBinaryBitFlippingEnabled, Mode=OneWay}"/>
<local:CalculatorProgrammerRadixOperators x:Name="ProgrammerRadixOperators"
x:Load="False"
IsEnabled="{x:Bind Model.AreProgrammerRadixOperatorsEnabled, Mode=OneWay}"
TabIndex="16"
Visibility="{x:Bind Model.IsProgrammer, Mode=OneWay}"/>
Visibility="{x:Bind Model.AreProgrammerRadixOperatorsEnabled, Mode=OneWay}"/>
</Grid>
</UserControl>

View File

@@ -16,15 +16,44 @@
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="AOTStates">
<VisualState x:Name="AOTNormalState"/>
<VisualState x:Name="AOTMiniState">
<VisualState.Setters>
<Setter Target="AppName.Visibility" Value="Collapsed"/>
<Setter Target="ExitAlwaysOnTopButton.Visibility" Value="Visible"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<TextBlock x:Name="AppName"
x:Uid="AppName"
Margin="12,0,12,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Foreground="{ThemeResource TitleBarForegroundBaseHighBrush}"
FontSize="12"
TextAlignment="Left"
TextTrimming="CharacterEllipsis"/>
<Grid x:Name="BackgroundElement"
Height="32"
Background="Transparent">
<TextBlock x:Name="AppName"
x:Uid="AppName"
Margin="12,0,12,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Foreground="{ThemeResource TitleBarForegroundBaseHighBrush}"
FontSize="12"
TextAlignment="Left"
TextTrimming="CharacterEllipsis"/>
</Grid>
<Button x:Name="ExitAlwaysOnTopButton"
x:Uid="ExitAlwaysOnTopButton"
Width="46"
Height="Auto"
HorizontalAlignment="Left"
HorizontalContentAlignment="Center"
Style="{ThemeResource CommandBarFlyoutEllipsisButtonStyle}"
Background="Transparent"
FontFamily="{StaticResource CalculatorFontFamily}"
FontSize="14"
FontWeight="Thin"
x:Load="False"
AutomationProperties.AutomationId="ExitAlwaysOnTopButton"
Click="AlwaysOnTopButton_Click"
Content="&#xEE47;"
Visibility="Collapsed"/>
</Grid>
</UserControl>

View File

@@ -15,11 +15,15 @@ using namespace Windows::UI;
using namespace Windows::UI::Core;
using namespace Windows::UI::ViewManagement;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::Foundation::Collections;
using namespace Concurrency;
namespace CalculatorApp
{
DEPENDENCY_PROPERTY_INITIALIZATION(TitleBar, IsAlwaysOnTopMode);
TitleBar::TitleBar()
: m_coreTitleBar(CoreApplication::GetCurrentView()->TitleBar)
{
@@ -27,10 +31,16 @@ namespace CalculatorApp
m_accessibilitySettings = ref new AccessibilitySettings();
InitializeComponent();
m_coreTitleBar->ExtendViewIntoTitleBar = true;
Window::Current->SetTitleBar(BackgroundElement);
Loaded += ref new RoutedEventHandler(this, &TitleBar::OnLoaded);
Unloaded += ref new RoutedEventHandler(this, &TitleBar::OnUnloaded);
#ifdef IS_STORE_BUILD
AppName->Text = AppResourceProvider::GetInstance().GetResourceString(L"AppName");
#else
AppName->Text = AppResourceProvider::GetInstance().GetResourceString(L"DevAppName");
#endif // IS_STORE_BUILD
}
void TitleBar::OnLoaded(_In_ Object ^ /*sender*/, _In_ RoutedEventArgs ^ /*e*/)
@@ -52,7 +62,7 @@ namespace CalculatorApp
// Set properties
LayoutRoot->Height = m_coreTitleBar->Height;
SetTitleBarControlColors();
SetTitleBarExtendView();
SetTitleBarVisibility();
SetTitleBarPadding();
}
@@ -72,14 +82,9 @@ namespace CalculatorApp
m_windowActivatedToken.Value = 0;
}
void TitleBar::SetTitleBarExtendView()
{
m_coreTitleBar->ExtendViewIntoTitleBar = !m_accessibilitySettings->HighContrast;
}
void TitleBar::SetTitleBarVisibility()
{
this->LayoutRoot->Visibility = m_coreTitleBar->IsVisible && !m_accessibilitySettings->HighContrast ? ::Visibility::Visible : ::Visibility::Collapsed;
this->LayoutRoot->Visibility = m_coreTitleBar->IsVisible || IsAlwaysOnTopMode ? ::Visibility::Visible : ::Visibility::Collapsed;
}
void TitleBar::SetTitleBarPadding()
@@ -157,7 +162,6 @@ namespace CalculatorApp
{
Dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new DispatchedHandler([this]() {
SetTitleBarControlColors();
SetTitleBarExtendView();
SetTitleBarVisibility();
}));
}
@@ -167,4 +171,15 @@ namespace CalculatorApp
VisualStateManager::GoToState(
this, e->WindowActivationState == CoreWindowActivationState::Deactivated ? WindowNotFocused->Name : WindowFocused->Name, false);
}
void TitleBar::OnIsAlwaysOnTopModePropertyChanged(bool /*oldValue*/, bool newValue)
{
SetTitleBarVisibility();
VisualStateManager::GoToState(this, newValue ? "AOTMiniState" : "AOTNormalState", false);
}
void TitleBar::AlwaysOnTopButton_Click(_In_ Object ^ /*sender*/, _In_ RoutedEventArgs ^ e)
{
AlwaysOnTopClick(this, e);
}
}

View File

@@ -4,6 +4,7 @@
#pragma once
#include "Views/TitleBar.g.h"
#include "CalcViewModel\ApplicationViewModel.h"
namespace CalculatorApp
{
@@ -18,6 +19,10 @@ public
public:
TitleBar();
DEPENDENCY_PROPERTY_OWNER(TitleBar);
DEPENDENCY_PROPERTY_WITH_CALLBACK(bool, IsAlwaysOnTopMode);
event Windows::UI::Xaml::RoutedEventHandler ^ AlwaysOnTopClick;
private:
void OnLoaded(_In_ Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
void OnUnloaded(_In_ Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
@@ -26,10 +31,10 @@ public
void SetTitleBarVisibility();
void SetTitleBarPadding();
void SetTitleBarControlColors();
void SetTitleBarExtendView();
void ColorValuesChanged(_In_ Windows::UI::ViewManagement::UISettings ^ sender, _In_ Platform::Object ^ e);
void OnHighContrastChanged(Windows::UI::ViewManagement::AccessibilitySettings ^ sender, Platform::Object ^ args);
void OnWindowActivated(Platform::Object ^ sender, Windows::UI::Core::WindowActivatedEventArgs ^ e);
void OnIsAlwaysOnTopModePropertyChanged(bool oldValue, bool newValue);
Platform::Agile<Windows::ApplicationModel::Core::CoreApplicationViewTitleBar ^> m_coreTitleBar;
Windows::Foundation::EventRegistrationToken m_layoutChangedToken;
@@ -39,5 +44,6 @@ public
Windows::Foundation::EventRegistrationToken m_accessibilitySettingsToken;
Windows::UI::ViewManagement::UISettings ^ m_uiSettings;
Windows::UI::ViewManagement::AccessibilitySettings ^ m_accessibilitySettings;
void AlwaysOnTopButton_Click(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
};
}

View File

@@ -341,7 +341,7 @@
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="Sizing">
<VisualStateGroup x:Name="Sizing" CurrentStateChanged="OnVisualStateChanged">
<VisualState x:Name="Wide">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowHeight="768" MinWindowWidth="1280"/>
@@ -706,7 +706,7 @@
Style="{StaticResource SymbolOperatorButtonStyle}"
FontSize="16"
ButtonId="Negate"
Content="&#xe94d;"
Content="&#xF898;"
TabIndex="6"
Visibility="{x:Bind Model.CurrentCategory.NegateVisibility, Mode=OneWay}"/>
</Grid>

View File

@@ -6,6 +6,7 @@
#include "pch.h"
#include "UnitConverter.xaml.h"
#include "CalcViewModel/Common/TraceLogger.h"
#include "CalcViewModel/UnitConverterViewModel.h"
#include "Controls/CalculationResult.h"
#include "Controls/CalculatorButton.h"
@@ -245,7 +246,7 @@ void UnitConverter::OnCopyMenuItemClicked(_In_ Object ^ sender, _In_ RoutedEvent
void UnitConverter::OnPasteMenuItemClicked(_In_ Object ^ sender, _In_ RoutedEventArgs ^ e)
{
CopyPasteManager::GetStringToPaste(Model->Mode, CategoryGroupType::Converter).then([this](String ^ pastedString) {
Model->OnPaste(pastedString, Model->Mode);
Model->OnPaste(pastedString);
});
}
@@ -368,3 +369,10 @@ void CalculatorApp::UnitConverter::SupplementaryResultsPanelInGrid_SizeChanged(P
// We add 0.01 to be sure to not create an infinite loop with SizeChanged events cascading due to float approximation
RowDltrUnits->MinHeight = max(48.0, e->NewSize.Height + 0.01);
}
void CalculatorApp::UnitConverter::OnVisualStateChanged(Platform::Object ^ sender, Windows::UI::Xaml::VisualStateChangedEventArgs ^ e)
{
auto mode = NavCategory::Deserialize(Model->CurrentCategory->GetModelCategory().id);
auto state = std::wstring(e->NewState->Name->Begin());
TraceLogger::GetInstance().LogVisualStateChanged(mode, state);
}

View File

@@ -89,5 +89,6 @@ namespace CalculatorApp
bool m_isAnimationEnabled;
void SupplementaryResultsPanelInGrid_SizeChanged(Platform::Object ^ sender, Windows::UI::Xaml::SizeChangedEventArgs ^ e);
void OnVisualStateChanged(Platform::Object ^ sender, Windows::UI::Xaml::VisualStateChangedEventArgs ^ e);
};
}