- remove double scrollviewer

- optimize ExpressionTokens in StandardCalculatorViewModel to only update new tokens instead of the full list
- refactor how we manage the visibility of left/right buttons
- remove useless ExpressionItemContainerStyle
- only modify accessbility view if necessary
This commit is contained in:
Rudy Huyn 2019-03-28 02:06:45 -07:00
commit 319ac1ff12
11 changed files with 141 additions and 309 deletions

View file

@ -129,6 +129,7 @@ StandardCalculatorViewModel::StandardCalculatorViewModel() :
AreHistoryShortcutsEnabled = true;
AreProgrammerRadixOperatorsEnabled = false;
m_ExpressionTokens = ref new Vector<DisplayExpressionToken^>();
m_tokenPosition = -1;
m_isLastOperationHistoryLoad = false;
}
@ -321,59 +322,66 @@ void StandardCalculatorViewModel::SetTokens(_Inout_ shared_ptr<CalculatorVector<
{
AreTokensUpdated = false;
if (m_ExpressionTokens == nullptr)
{
m_ExpressionTokens = ref new Vector<DisplayExpressionToken^>();
}
else
{
m_ExpressionTokens->Clear();
}
unsigned int nTokens = 0;
tokens->GetSize(&nTokens);
if (nTokens == 0)
{
m_ExpressionTokens->Clear();
return;
}
pair <wstring, int> currentToken;
const auto& localizer = LocalizationSettings::GetInstance();
const wstring separator = L" ";
for (unsigned int i = 0; i < nTokens; ++i)
{
if (SUCCEEDED(tokens->GetAt(i, &currentToken)))
{
Common::TokenType type;
const wstring separator = L" ";
bool isEditable = (currentToken.second == -1) ? false : true;
localizer.LocalizeDisplayValue(&(currentToken.first));
if (!isEditable)
{
if (currentToken.first == separator)
{
type = TokenType::Separator;
}
else
{
type = TokenType::Operator;
}
type = currentToken.first == separator ? TokenType::Separator : TokenType::Operator;
}
else
{
shared_ptr<IExpressionCommand> command;
IFTPlatformException(m_commands->GetAt(static_cast<unsigned int>(currentToken.second), &command));
type = command->GetCommandType() == CommandType::OperandCommand ? TokenType::Operand : TokenType::Operator;
}
if (command->GetCommandType() == CommandType::OperandCommand)
auto currentTokenString = ref new String(currentToken.first.c_str());
auto expressionToken = ref new DisplayExpressionToken(currentTokenString, i, isEditable, type);
if (i < m_ExpressionTokens->Size)
{
auto existingItem = m_ExpressionTokens->GetAt(i);
if (type == existingItem->Type && expressionToken->Token->Equals(currentTokenString))
{
type = TokenType::Operand;
existingItem->TokenPosition = i;
existingItem->IsTokenEditable = isEditable;
existingItem->CommandIndex = expressionToken->CommandIndex;
}
else
{
type = TokenType::Operator;
m_ExpressionTokens->InsertAt(i, expressionToken);
}
}
else
{
m_ExpressionTokens->Append(expressionToken);
}
DisplayExpressionToken^ expressionToken = ref new DisplayExpressionToken(ref new String(currentToken.first.c_str()), i, isEditable, type);
m_ExpressionTokens->Append(expressionToken);
}
}
while (m_ExpressionTokens->Size != nTokens)
{
m_ExpressionTokens->RemoveAtEnd();
}
}
String^ StandardCalculatorViewModel::GetCalculatorExpressionAutomationName()
@ -531,7 +539,7 @@ void StandardCalculatorViewModel::HandleUpdatedOperandData(Command cmdenum)
{
if (commandIndex == 0)
{
delete [] temp;
delete[] temp;
return;
}
@ -552,7 +560,7 @@ void StandardCalculatorViewModel::HandleUpdatedOperandData(Command cmdenum)
length = m_selectedExpressionLastData->Length() + 1;
if (length > 50)
{
delete [] temp;
delete[] temp;
return;
}
for (; i < length; ++i)
@ -1422,29 +1430,29 @@ void StandardCalculatorViewModel::SaveEditedCommand(_In_ unsigned int tokenPosit
switch (nOpCode)
{
case static_cast<int>(Command::CommandASIN) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSIN), true, angleType);
break;
case static_cast<int>(Command::CommandACOS) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOS), true, angleType);
break;
case static_cast<int>(Command::CommandATAN) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTAN), true, angleType);
break;
case static_cast<int>(Command::CommandASINH) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSINH), true, angleType);
break;
case static_cast<int>(Command::CommandACOSH) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOSH), true, angleType);
break;
case static_cast<int>(Command::CommandATANH) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTANH), true, angleType);
break;
case static_cast<int>(Command::CommandPOWE) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandLN), true, angleType);
break;
default:
updatedToken = CCalcEngine::OpCodeToUnaryString(nOpCode, false, angleType);
case static_cast<int>(Command::CommandASIN) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSIN), true, angleType);
break;
case static_cast<int>(Command::CommandACOS) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOS), true, angleType);
break;
case static_cast<int>(Command::CommandATAN) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTAN), true, angleType);
break;
case static_cast<int>(Command::CommandASINH) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSINH), true, angleType);
break;
case static_cast<int>(Command::CommandACOSH) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOSH), true, angleType);
break;
case static_cast<int>(Command::CommandATANH) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTANH), true, angleType);
break;
case static_cast<int>(Command::CommandPOWE) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandLN), true, angleType);
break;
default:
updatedToken = CCalcEngine::OpCodeToUnaryString(nOpCode, false, angleType);
}
if ((token.first.length() > 0) && (token.first[token.first.length() - 1] == L'('))
{

View file

@ -48,7 +48,7 @@ namespace CalculatorApp
OBSERVABLE_NAMED_PROPERTY_RW(bool, IsInError);
OBSERVABLE_PROPERTY_RW(bool, IsOperatorCommand);
OBSERVABLE_PROPERTY_RW(Platform::String^, DisplayStringExpression);
OBSERVABLE_PROPERTY_RW(Windows::Foundation::Collections::IVector<Common::DisplayExpressionToken^>^, ExpressionTokens);
OBSERVABLE_PROPERTY_R(Windows::Foundation::Collections::IObservableVector<Common::DisplayExpressionToken^>^, ExpressionTokens);
OBSERVABLE_PROPERTY_RW(Platform::String^, DecimalDisplayValue);
OBSERVABLE_PROPERTY_RW(Platform::String^, HexDisplayValue);
OBSERVABLE_PROPERTY_RW(Platform::String^, OctalDisplayValue);

View file

@ -246,7 +246,6 @@
<ClInclude Include="Converters\BitFlipAutomationNameConverter.h" />
<ClInclude Include="Converters\BooleanNegationConverter.h" />
<ClInclude Include="Converters\BooleanToVisibilityConverter.h" />
<ClInclude Include="Converters\ExpressionItemContainerStyle.h" />
<ClInclude Include="Converters\ExpressionItemTemplateSelector.h" />
<ClInclude Include="Converters\ItemSizeToVisibilityConverter.h" />
<ClInclude Include="Converters\RadixToStringConverter.h" />
@ -380,7 +379,6 @@
<ClCompile Include="Converters\BitFlipAutomationNameConverter.cpp" />
<ClCompile Include="Converters\BooleanNegationConverter.cpp" />
<ClCompile Include="Converters\BooleanToVisibilityConverter.cpp" />
<ClCompile Include="Converters\ExpressionItemContainerStyle.cpp" />
<ClCompile Include="Converters\ExpressionItemTemplateSelector.cpp" />
<ClCompile Include="Converters\ItemSizeToVisibilityConverter.cpp" />
<ClCompile Include="Converters\RadixToStringConverter.cpp" />

View file

@ -243,9 +243,6 @@
<ClCompile Include="Converters\BooleanToVisibilityConverter.cpp">
<Filter>Converters</Filter>
</ClCompile>
<ClCompile Include="Converters\ExpressionItemContainerStyle.cpp">
<Filter>Converters</Filter>
</ClCompile>
<ClCompile Include="Converters\ExpressionItemTemplateSelector.cpp">
<Filter>Converters</Filter>
</ClCompile>
@ -342,9 +339,6 @@
<ClInclude Include="Converters\BooleanToVisibilityConverter.h">
<Filter>Converters</Filter>
</ClInclude>
<ClInclude Include="Converters\ExpressionItemContainerStyle.h">
<Filter>Converters</Filter>
</ClInclude>
<ClInclude Include="Converters\ExpressionItemTemplateSelector.h">
<Filter>Converters</Filter>
</ClInclude>

View file

@ -34,7 +34,7 @@ void OverflowTextBlock::OnApplyTemplate()
m_expressionContainer = safe_cast<ScrollViewer^>(GetTemplateChild("expressionContainer"));
m_expressionContainer->ChangeView(m_expressionContainer->ExtentWidth - m_expressionContainer->ViewportWidth, nullptr, nullptr);
m_expressionContainer->ViewChanged += ref new Windows::Foundation::EventHandler<Windows::UI::Xaml::Controls::ScrollViewerViewChangedEventArgs ^>(this, &CalculatorApp::Controls::OverflowTextBlock::OnViewChanged);
m_scrollLeft = safe_cast<Button^>(GetTemplateChild("scrollLeft"));
m_scrollRight = safe_cast<Button^>(GetTemplateChild("scrollRight"));
@ -44,12 +44,7 @@ void OverflowTextBlock::OnApplyTemplate()
m_scrollingLeft = false;
m_scrollingRight = false;
auto borderContainer = safe_cast<Border^>(GetTemplateChild("expressionborder"));
m_pointerEnteredEventToken = borderContainer->PointerEntered += ref new PointerEventHandler(this, &OverflowTextBlock::OnPointerEntered);
m_pointerExitedEventToken = borderContainer->PointerExited += ref new PointerEventHandler(this, &OverflowTextBlock::OnPointerExited);
m_listView = safe_cast<ListView^>(GetTemplateChild("TokenList"));
m_itemsControl = safe_cast<ItemsControl^>(GetTemplateChild("TokenList"));
UpdateAllState();
}
@ -60,18 +55,19 @@ AutomationPeer^ OverflowTextBlock::OnCreateAutomationPeer()
void OverflowTextBlock::OnTokensUpdatedPropertyChanged(bool /*oldValue*/, bool newValue)
{
if ((m_listView != nullptr) && (newValue))
if ((m_expressionContainer != nullptr) && (newValue))
{
unsigned int tokenCount = m_listView->Items->Size;
if (tokenCount > 0)
{
m_listView->UpdateLayout();
m_listView->ScrollIntoView(m_listView->Items->GetAt(tokenCount - 1));
m_expressionContainer->ChangeView(m_expressionContainer->ExtentWidth - m_expressionContainer->ViewportWidth, nullptr, nullptr);
}
m_expressionContainer->UpdateLayout();
m_expressionContainer->ChangeView(m_expressionContainer->ScrollableWidth, nullptr, nullptr, true);
}
AutomationProperties::SetAccessibilityView(this,
m_listView != nullptr && m_listView->Items->Size > 0 ? AccessibilityView::Control : AccessibilityView::Raw);
auto newIsAccessibilityViewControl = m_itemsControl != nullptr && m_itemsControl->Items->Size > 0;
if (m_isAccessibilityViewControl != newIsAccessibilityViewControl)
{
m_isAccessibilityViewControl = newIsAccessibilityViewControl;
AutomationProperties::SetAccessibilityView(this,
newIsAccessibilityViewControl ? AccessibilityView::Control : AccessibilityView::Raw);
}
UpdateScrollButtons();
}
void OverflowTextBlock::UpdateAllState()
@ -128,26 +124,15 @@ void OverflowTextBlock::OnScrollClick(_In_ Object^ sender, _In_ RoutedEventArgs^
}
}
void OverflowTextBlock::OnPointerEntered(_In_ Object^, _In_ PointerRoutedEventArgs^ e)
{
if (e->Pointer->PointerDeviceType == PointerDeviceType::Mouse)
{
UpdateScrollButtons();
}
}
void OverflowTextBlock::OnPointerExited(_In_ Object^, _In_ PointerRoutedEventArgs^ e)
{
if (e->Pointer->PointerDeviceType == PointerDeviceType::Mouse)
{
UpdateScrollButtons();
}
}
void OverflowTextBlock::UpdateScrollButtons()
{
if (m_itemsControl == nullptr && m_expressionContainer == nullptr)
{
return;
}
// When the width is smaller than the container, don't show any
if (m_listView->ActualWidth <= m_expressionContainer->ActualWidth)
if (m_itemsControl->ActualWidth <= m_expressionContainer->ActualWidth)
{
ShowHideScrollButtons(::Visibility::Collapsed, ::Visibility::Collapsed);
}
@ -163,7 +148,10 @@ void OverflowTextBlock::UpdateScrollButtons()
if (m_scrollingLeft)
{
m_scrollingLeft = false;
m_scrollRight->Focus(::FocusState::Programmatic);
if (m_scrollRight != nullptr)
{
m_scrollRight->Focus(::FocusState::Programmatic);
}
}
}
else // Width is larger than the container and right most part of the number is shown. Should be able to scroll left.
@ -172,7 +160,10 @@ void OverflowTextBlock::UpdateScrollButtons()
if (m_scrollingRight)
{
m_scrollingRight = false;
m_scrollLeft->Focus(::FocusState::Programmatic);
if (m_scrollLeft != nullptr)
{
m_scrollLeft->Focus(::FocusState::Programmatic);
}
}
}
}
@ -198,13 +189,10 @@ void OverflowTextBlock::UnregisterEventHandlers()
{
m_scrollRight->Click -= m_scrollRightClickEventToken;
}
auto borderContainer = safe_cast<Border^>(GetTemplateChild("expressionborder"));
// Adding an extra check, in case the returned template is null
if (borderContainer != nullptr)
{
borderContainer->PointerEntered -= m_pointerEnteredEventToken;
borderContainer->PointerExited -= m_pointerExitedEventToken;
}
}
void CalculatorApp::Controls::OverflowTextBlock::OnViewChanged(Platform::Object ^sender, Windows::UI::Xaml::Controls::ScrollViewerViewChangedEventArgs ^args)
{
UpdateScrollButtons();
}

View file

@ -44,15 +44,15 @@ namespace CalculatorApp
double scrollRatio = 0.7;
bool m_scrollingLeft;
bool m_scrollingRight;
Windows::UI::Xaml::Controls::ListView^ m_listView;
bool m_isAccessibilityViewControl;
Windows::UI::Xaml::Controls::ItemsControl^ m_itemsControl;
Windows::UI::Xaml::Controls::ScrollViewer^ m_expressionContainer;
Windows::UI::Xaml::Controls::Button^ m_scrollLeft;
Windows::UI::Xaml::Controls::Button^ m_scrollRight;
Windows::Foundation::EventRegistrationToken m_scrollLeftClickEventToken;
Windows::Foundation::EventRegistrationToken m_scrollRightClickEventToken;
Windows::Foundation::EventRegistrationToken m_pointerEnteredEventToken;
Windows::Foundation::EventRegistrationToken m_pointerExitedEventToken;
void OnViewChanged(Platform::Object ^sender, Windows::UI::Xaml::Controls::ScrollViewerViewChangedEventArgs ^args);
};
}
}

View file

@ -1,44 +0,0 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#include "pch.h"
#include "ExpressionItemContainerStyle.h"
#include "CalcViewModel/Common/DisplayExpressionToken.h"
using namespace CalculatorApp::Common;
namespace CalculatorApp
{
namespace Converters
{
Windows::UI::Xaml::Style^ ExpressionItemContainerStyle::SelectStyleCore(Platform::Object^ item, Windows::UI::Xaml::DependencyObject^ container)
{
DisplayExpressionToken^ token = dynamic_cast<DisplayExpressionToken^>(item);
if (token != nullptr)
{
Common::TokenType type = token->Type;
switch (type)
{
case TokenType::Operator:
if (token->IsTokenEditable)
{
return m_editableOperatorStyle;
}
else
{
return m_nonEditableOperatorStyle;
}
case TokenType::Operand:
return m_operandStyle;
case TokenType::Separator:
return m_separatorStyle;
default:
throw ref new Platform::Exception(E_FAIL, L"Invalid token type");
}
}
return m_separatorStyle;
}
}
}

View file

@ -1,71 +0,0 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#pragma once
namespace CalculatorApp
{
namespace Converters
{
[Windows::UI::Xaml::Data::Bindable]
public ref class ExpressionItemContainerStyle sealed : public Windows::UI::Xaml::Controls::StyleSelector
{
public:
virtual Windows::UI::Xaml::Style^ SelectStyleCore(Platform::Object^ item, Windows::UI::Xaml::DependencyObject^ container) override;
property Windows::UI::Xaml::Style^ EditableOperatorStyle
{
Windows::UI::Xaml::Style^ get()
{
return m_editableOperatorStyle;
}
void set(Windows::UI::Xaml::Style^ val)
{
m_editableOperatorStyle = val;
}
}
property Windows::UI::Xaml::Style^ OperandStyle
{
Windows::UI::Xaml::Style^ get()
{
return m_operandStyle;
}
void set(Windows::UI::Xaml::Style^ val)
{
m_operandStyle = val;
}
}
property Windows::UI::Xaml::Style^ SeparatorStyle
{
Windows::UI::Xaml::Style^ get()
{
return m_separatorStyle;
}
void set(Windows::UI::Xaml::Style^ val)
{
m_separatorStyle = val;
}
}
property Windows::UI::Xaml::Style^ NonEditableOperatorStyle
{
Windows::UI::Xaml::Style^ get()
{
return m_nonEditableOperatorStyle;
}
void set(Windows::UI::Xaml::Style^ val)
{
m_nonEditableOperatorStyle = val;
}
}
private:
Windows::UI::Xaml::Style^ m_editableOperatorStyle;
Windows::UI::Xaml::Style^ m_nonEditableOperatorStyle;
Windows::UI::Xaml::Style^ m_operandStyle;
Windows::UI::Xaml::Style^ m_separatorStyle;
};
}
}

View file

@ -8,7 +8,6 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:CalculatorApp"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:model="using:CalculatorApp.ViewModel"
Loaded="OnLoaded"
mc:Ignorable="d">
@ -19,20 +18,20 @@
<TextBlock Margin="2,0,0,0"
Foreground="{ThemeResource SystemControlPageTextBaseMediumBrush}"
IsTextScaleFactorEnabled="False"
Text="{Binding Token, Mode=OneWay}"/>
Text="{x:Bind Token}"/>
</DataTemplate>
<DataTemplate x:Key="Operator" x:DataType="common:DisplayExpressionToken">
<TextBlock Margin="2,0,0,0"
Foreground="{ThemeResource SystemControlPageTextBaseMediumBrush}"
IsTextScaleFactorEnabled="False"
Text="{Binding Token, Mode=OneWay}"/>
Text="{x:Bind Token}"/>
</DataTemplate>
<DataTemplate x:Key="Separator" x:DataType="common:DisplayExpressionToken">
<TextBlock x:Name="MainText"
IsTextScaleFactorEnabled="False"
Text="{Binding Token, Mode=OneWay}"/>
Text="{x:Bind Token}"/>
</DataTemplate>
<!-- TextBox Styles -->
@ -141,66 +140,54 @@
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls:OverflowTextBlock">
<Border x:Name="expressionborder" Background="Transparent">
<Grid x:Name="tokenContainer" Background="{TemplateBinding Background}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="12"/>
<ColumnDefinition/>
<ColumnDefinition Width="12"/>
</Grid.ColumnDefinitions>
<ScrollViewer x:Name="expressionContainer"
Grid.Column="1"
Padding="0,0,0,0"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Style="{StaticResource ResultsScrollerSnapped}"
AutomationProperties.AccessibilityView="Raw"
LayoutUpdated="expressionContainer_LayoutUpdated">
<ListView x:Name="TokenList"
<Grid x:Name="tokenContainer" Background="{TemplateBinding Background}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="12"/>
<ColumnDefinition/>
<ColumnDefinition Width="12"/>
</Grid.ColumnDefinitions>
<ScrollViewer x:Name="expressionContainer"
Grid.Column="1"
Padding="0,0,0,0"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Style="{StaticResource ResultsScrollerSnapped}"
AutomationProperties.AccessibilityView="Raw">
<ItemsControl x:Name="TokenList"
Padding="0"
VerticalAlignment="Stretch"
HorizontalContentAlignment="Right"
VerticalContentAlignment="Stretch"
IsTabStop="False"
ItemContainerStyleSelector="{StaticResource ExpressionItemContainerStyle}"
ItemTemplateSelector="{StaticResource ExpressionItemTemplateSelector}"
ItemsSource="{Binding ExpressionTokens}"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ScrollViewer.HorizontalScrollMode="Enabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollMode="Disabled"
SelectionMode="None">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel HorizontalAlignment="Right"
VerticalAlignment="Stretch"
Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemContainerTransitions>
<TransitionCollection/>
</ListView.ItemContainerTransitions>
</ListView>
</ScrollViewer>
<Button x:Name="scrollLeft"
x:Uid="scrollLeft"
Grid.Column="0"
Margin="-4,3,-4,0"
Style="{StaticResource ScrollButtonStyle}">
<FontIcon FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="12"
Glyph="&#xE26C;"/>
</Button>
<Button x:Name="scrollRight"
x:Uid="scrollRight"
Grid.Column="2"
Margin="0,3,-9,0"
Style="{StaticResource ScrollButtonStyle}">
<FontIcon FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="12"
Glyph="&#xE26B;"/>
</Button>
</Grid>
</Border>
ItemsSource="{Binding ExpressionTokens}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel HorizontalAlignment="Right"
VerticalAlignment="Stretch"
Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
<Button x:Name="scrollLeft"
x:Uid="scrollLeft"
Grid.Column="0"
Margin="-4,3,-4,0"
Style="{StaticResource ScrollButtonStyle}">
<FontIcon FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="12"
Glyph="&#xE26C;"/>
</Button>
<Button x:Name="scrollRight"
x:Uid="scrollRight"
Grid.Column="2"
Margin="0,3,-9,0"
Style="{StaticResource ScrollButtonStyle}">
<FontIcon FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="12"
Glyph="&#xE26B;"/>
</Button>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
@ -239,21 +226,6 @@
</Setter>
</Style>
<Style x:Key="NonEditableOperatorContainerStyle"
BasedOn="{StaticResource ExpressionBaseContainerStyle}"
TargetType="ListViewItem">
<Setter Property="IsHitTestVisible" Value="False"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="MinWidth" Value="4"/>
</Style>
<Style x:Key="EditableOperatorContainerStyle"
BasedOn="{StaticResource ExpressionBaseContainerStyle}"
TargetType="ListViewItem">
<Setter Property="IsHitTestVisible" Value="True"/>
<Setter Property="MinWidth" Value="32"/>
</Style>
<!-- Calculation Result Styles -->
<Style x:Key="ResultsStyleL"
@ -443,12 +415,6 @@
OperatorTemplate="{StaticResource Operator}"
SeparatorTemplate="{StaticResource Separator}"/>
<converters:ExpressionItemContainerStyle x:Key="ExpressionItemContainerStyle"
EditableOperatorStyle="{StaticResource NonEditableOperatorContainerStyle}"
NonEditableOperatorStyle="{StaticResource NonEditableOperatorContainerStyle}"
OperandStyle="{StaticResource NonEditableOperatorContainerStyle}"
SeparatorStyle="{StaticResource NonEditableOperatorContainerStyle}"/>
<!-- Miscellaneous Resources -->
<automation:NarratorNotifier x:Name="NarratorNotifier" Announcement="{x:Bind Model.Announcement, Mode=OneWay}"/>
@ -649,7 +615,7 @@
AutomationProperties.AutomationId="CalculatorExpression"
AutomationProperties.Name="{x:Bind Model.CalculationExpressionAutomationName, Mode=OneWay}"
IsTabStop="False"
TokensUpdated="{Binding AreTokensUpdated, Mode=OneWay}"/>
TokensUpdated="{x:Bind Model.AreTokensUpdated, Mode=OneWay}"/>
<!-- Programmer display panel controls -->
<local:CalculatorProgrammerOperators x:Name="ProgrammerOperators"

View file

@ -685,11 +685,6 @@ void Calculator::OnHistoryFlyOutTapped(_In_ Object^ sender, _In_ TappedRoutedEve
}
}
void Calculator::expressionContainer_LayoutUpdated(_In_ Object^ sender, _In_ Object^ e)
{
expressionText->UpdateScrollButtons();
}
bool Calculator::IsValidRegularExpression(std::wstring str)
{
bool result = false;

View file

@ -1,11 +1,10 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#pragma once
#include "Views/Calculator.g.h"
#include "Converters/BooleanNegationConverter.h"
#include "Converters/ExpressionItemContainerStyle.h"
#include "Converters/ExpressionItemTemplateSelector.h"
#include "Converters/VisibilityNegationConverter.h"
#include "CalcViewModel/Common/Automation/NarratorNotifier.h"
@ -130,7 +129,6 @@ namespace CalculatorApp
void EnableMemoryControls(bool enable);
void OnMemoryFlyOutTapped(_In_ Platform::Object^ sender, _In_ Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e);
void OnHistoryFlyOutTapped(_In_ Platform::Object^ sender, _In_ Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e);
void expressionContainer_LayoutUpdated(_In_ Platform::Object^ sender, _In_ Platform::Object^ e);
bool IsValidRegularExpression(std::wstring str);
void DockPanelTapped(_In_ Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e);
void OnResultsLayoutChanged(_In_ Platform::Object^ sender, _In_ Platform::Object^ e);