Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update CornerRadiusFilterConverter to work around a TemplateBinding bug #1239

Merged
merged 4 commits into from
Aug 30, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 10 additions & 13 deletions dev/Common/CornerRadiusFilterConverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,6 @@ winrt::CornerRadius CornerRadiusFilterConverter::Convert(winrt::CornerRadius con
result.TopRight = 0;
result.BottomRight = 0;
break;
case winrt::CornerRadiusFilterKind::TopLeft:
result.TopRight = 0;
result.BottomLeft = 0;
result.BottomRight = 0;
break;
case winrt::CornerRadiusFilterKind::BottomRight:
result.TopLeft = 0;
result.TopRight = 0;
result.BottomLeft = 0;
break;
}

return result;
Expand All @@ -46,9 +36,9 @@ double CornerRadiusFilterConverter::GetDoubleValue(winrt::CornerRadius const& ra
{
switch (filterKind)
{
case winrt::CornerRadiusFilterKind::TopLeft:
case winrt::CornerRadiusFilterKind::TopLeftValue:
return radius.TopLeft;
case winrt::CornerRadiusFilterKind::BottomRight:
case winrt::CornerRadiusFilterKind::BottomRightValue:
return radius.BottomRight;
}
return 0;
Expand All @@ -61,7 +51,14 @@ winrt::IInspectable CornerRadiusFilterConverter::Convert(
winrt::hstring const& language)
{
auto cornerRadius = unbox_value<winrt::CornerRadius>(value);
return ReturnAsDouble() ? box_value(GetDoubleValue(cornerRadius, Filter())) : box_value(Convert(cornerRadius, Filter()));
auto filterType = Filter();
if (filterType == winrt::CornerRadiusFilterKind::TopLeftValue ||
filterType == winrt::CornerRadiusFilterKind::BottomRightValue)
{
return box_value(GetDoubleValue(cornerRadius, Filter()));
}

return box_value(Convert(cornerRadius, Filter()));
}

winrt::IInspectable CornerRadiusFilterConverter::ConvertBack(
Expand Down
8 changes: 2 additions & 6 deletions dev/Common/CornerRadiusFilterConverters.idl
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,7 @@ runtimeclass CornerRadiusFilterConverter : Windows.UI.Xaml.DependencyObject, Win
[MUX_DEFAULT_VALUE("winrt::CornerRadiusFilterKind::None")]
CornerRadiusFilterKind Filter{ get; set; };

[MUX_DEFAULT_VALUE("false")]
Boolean ReturnAsDouble{ get; set; };

static Windows.UI.Xaml.DependencyProperty FilterProperty{ get; };
static Windows.UI.Xaml.DependencyProperty ReturnAsDoubleProperty{ get; };
};

[WUXC_VERSION_MUXONLY]
Expand All @@ -27,8 +23,8 @@ enum CornerRadiusFilterKind
Right,
Bottom,
Left,
TopLeft,
BottomRight
TopLeftValue,
BottomRightValue
};
kaiguo marked this conversation as resolved.
Show resolved Hide resolved

}
4 changes: 2 additions & 2 deletions dev/CommonStyles/CornerRadius_themeresources.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<primitives:CornerRadiusFilterConverter x:Key="RightCornerRadiusFilterConverter" Filter="Right"/>
<primitives:CornerRadiusFilterConverter x:Key="BottomCornerRadiusFilterConverter" Filter="Bottom"/>
<primitives:CornerRadiusFilterConverter x:Key="LeftCornerRadiusFilterConverter" Filter="Left"/>
<primitives:CornerRadiusFilterConverter x:Key="TopLeftCornerRadiusDoubleValueConverter" Filter="TopLeft" ReturnAsDouble="True"/>
<primitives:CornerRadiusFilterConverter x:Key="BottomRightCornerRadiusDoubleValueConverter" Filter="BottomRight" ReturnAsDouble="True"/>
<primitives:CornerRadiusFilterConverter x:Key="TopLeftCornerRadiusDoubleValueConverter" Filter="TopLeftValue"/>
<primitives:CornerRadiusFilterConverter x:Key="BottomRightCornerRadiusDoubleValueConverter" Filter="BottomRightValue"/>

</ResourceDictionary>
23 changes: 0 additions & 23 deletions dev/Generated/CornerRadiusFilterConverter.properties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
CppWinRTActivatableClassWithDPFactory(CornerRadiusFilterConverter)

GlobalDependencyProperty CornerRadiusFilterConverterProperties::s_FilterProperty{ nullptr };
GlobalDependencyProperty CornerRadiusFilterConverterProperties::s_ReturnAsDoubleProperty{ nullptr };

CornerRadiusFilterConverterProperties::CornerRadiusFilterConverterProperties()
{
Expand All @@ -29,23 +28,11 @@ void CornerRadiusFilterConverterProperties::EnsureProperties()
ValueHelper<winrt::CornerRadiusFilterKind>::BoxValueIfNecessary(winrt::CornerRadiusFilterKind::None),
nullptr);
}
if (!s_ReturnAsDoubleProperty)
{
s_ReturnAsDoubleProperty =
InitializeDependencyProperty(
L"ReturnAsDouble",
winrt::name_of<bool>(),
winrt::name_of<winrt::CornerRadiusFilterConverter>(),
false /* isAttached */,
ValueHelper<bool>::BoxValueIfNecessary(false),
nullptr);
}
}

void CornerRadiusFilterConverterProperties::ClearProperties()
{
s_FilterProperty = nullptr;
s_ReturnAsDoubleProperty = nullptr;
}

void CornerRadiusFilterConverterProperties::Filter(winrt::CornerRadiusFilterKind const& value)
Expand All @@ -57,13 +44,3 @@ winrt::CornerRadiusFilterKind CornerRadiusFilterConverterProperties::Filter()
{
return ValueHelper<winrt::CornerRadiusFilterKind>::CastOrUnbox(static_cast<CornerRadiusFilterConverter*>(this)->GetValue(s_FilterProperty));
}

void CornerRadiusFilterConverterProperties::ReturnAsDouble(bool value)
{
static_cast<CornerRadiusFilterConverter*>(this)->SetValue(s_ReturnAsDoubleProperty, ValueHelper<bool>::BoxValueIfNecessary(value));
}

bool CornerRadiusFilterConverterProperties::ReturnAsDouble()
{
return ValueHelper<bool>::CastOrUnbox(static_cast<CornerRadiusFilterConverter*>(this)->GetValue(s_ReturnAsDoubleProperty));
}
5 changes: 0 additions & 5 deletions dev/Generated/CornerRadiusFilterConverter.properties.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,9 @@ class CornerRadiusFilterConverterProperties
void Filter(winrt::CornerRadiusFilterKind const& value);
winrt::CornerRadiusFilterKind Filter();

void ReturnAsDouble(bool value);
bool ReturnAsDouble();

static winrt::DependencyProperty FilterProperty() { return s_FilterProperty; }
static winrt::DependencyProperty ReturnAsDoubleProperty() { return s_ReturnAsDoubleProperty; }

static GlobalDependencyProperty s_FilterProperty;
static GlobalDependencyProperty s_ReturnAsDoubleProperty;

static void EnsureProperties();
static void ClearProperties();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,16 @@ public void RepeaterNoCrashTest()
var item3 = FindElement.ByName("Item3");
Verify.IsNotNull(item3);
}

[TestMethod]
public void CornerRadiusTest()
{
var button = new Button(FindElement.ByName("GetCheckBoxRectangleCornerRadiusValue"));
button.Click();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommend using Invoke() instead of Click() (which is mouse input) for better speed and reliability

Wait.ForIdle();

var textBlock = new TextBlock(FindElement.ByName("CheckBoxRectangleCornerRadiusValueTextBlock"));
Verify.AreEqual("2,2", textBlock.DocumentText);
}
}
}
10 changes: 8 additions & 2 deletions test/MUXControlsReleaseTest/NugetPackageTestAppCX/MainPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,19 @@

<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock x:Name="TestTextBlock" AutomationProperties.Name="TestTextBlock" Text="Loaded"/>
<Button Grid.Row="1" Click="OnAddItemsButtonClick" Content="Add Items" AutomationProperties.Name="AddItemsButton" />
<ScrollViewer Grid.Row="2">
<StackPanel Grid.Row="1" Orientation="Horizontal">
<CheckBox x:Name="TestCheckBox" AutomationProperties.Name="TestCheckBox" Content="CheckBox" />
<Button x:Name="GetCheckBoxRectangleCornerRadiusValue" Content="GetCheckBoxRectangleCornerRadiusValue" AutomationProperties.Name="GetCheckBoxRectangleCornerRadiusValue" Click="GetCheckBoxRectangleCornerRadiusValue_Click"/>
<TextBlock x:Name="CheckBoxRectangleCornerRadiusValueTextBlock" AutomationProperties.Name="CheckBoxRectangleCornerRadiusValueTextBlock"></TextBlock>
</StackPanel>
<Button Grid.Row="2" Click="OnAddItemsButtonClick" Content="Add Items" AutomationProperties.Name="AddItemsButton" />
<ScrollViewer Grid.Row="3">
<controls:ItemsRepeater x:Name="Repeater" />
</ScrollViewer>
</Grid>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;
using namespace Windows::UI::Xaml::Shapes;

MainPage::MainPage() :
mItems(ref new Vector<String^>())
Expand Down Expand Up @@ -64,3 +65,28 @@ void NugetPackageTestAppCX::MainPage::WaitForIdleInvokerButton_Click(Platform::O
});
auto asyncAction = Windows::System::Threading::ThreadPool::RunAsync(workItem);
}

void NugetPackageTestAppCX::MainPage::GetCheckBoxRectangleCornerRadiusValue_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
GetCheckBoxRectangleCornerRadius(TestCheckBox);
}

void NugetPackageTestAppCX::MainPage::GetCheckBoxRectangleCornerRadius(DependencyObject^ obj)
{
if (obj == nullptr) return;

auto count = VisualTreeHelper::GetChildrenCount(obj);
for (int i = 0; i < count; i++)
{
auto child = VisualTreeHelper::GetChild(obj, i);
if (auto rec = dynamic_cast<Rectangle^>(child))
{
CheckBoxRectangleCornerRadiusValueTextBlock->Text = rec->RadiusX + "," + rec->RadiusY;
}
else
{
GetCheckBoxRectangleCornerRadius(child);
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,11 @@ namespace NugetPackageTestAppCX
void CloseAppInvokerButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
void PageLoaded(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
void OnAddItemsButtonClick(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
void GetCheckBoxRectangleCornerRadiusValue_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);

Platform::Collections::Vector<Platform::String^>^ mItems;
void WaitForIdleInvokerButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);

void GetCheckBoxRectangleCornerRadius(DependencyObject^ obj);
};
}