我正在尝试获取弹出控件的X,Y坐标.我试过了:
VisualTreeHelper.GetOffset(弹出);
但是返回的向量总是包含(0,0)X和Y.
弹出窗口的父级是布局根,它是一个网格.
CustomPopupPlacementCallback也总是为它的Point参数返回0,0.
目标是允许用户在屏幕上的任何位置拖动弹出窗口.我打算尝试通过获取当前弹出窗口和鼠标位置来完成此操作,并在与鼠标移动相同的方向上移动弹出窗口.
--------------------更新--------------------
Chris Nicol,我已经使用以下代码尝试了您的答案,但仍然收到0,0 for rootPoint:
XAML:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Test.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="800" Height="600">
<Grid x:Name="LayoutRoot">
<Popup x:Name="Popup" IsOpen="True" Placement="Center" Width="100" Height="100">
<Button Click="Button_Click" Content="Test" />
</Popup>
</Grid>
Run Code Online (Sandbox Code Playgroud)
代码背后:
public partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
// Insert code required on object creation below this point.
}
private void Button_Click(object sender, RoutedEventArgs e)
{
GeneralTransform transform = Popup.TransformToAncestor(LayoutRoot);
Point rootPoint = transform.Transform(new Point(0, 0));
}
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个经历相同问题的代码的简化版本.问题是我不确定为什么我的自定义控件中的依赖属性在模型中被更改时不会更新.
模型:
public class MainWindowModel : INotifyPropertyChanged
{
private bool isChecked;
public bool IsChecked { get { return isChecked; } set { isChecked = value; OnPropertyChanged("IsChecked"); } }
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string prop)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
Run Code Online (Sandbox Code Playgroud)
XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:custom="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Grid>
<custom:CustomTextbox x:Name="TextboxName" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" TextChanged="CustomTextbox_TextChanged">
<custom:CustomTextbox.CustomTextboxItems>
<custom:CustomTextboxItem IsChecked="{Binding IsChecked}" />
</custom:CustomTextbox.CustomTextboxItems>
</custom:CustomTextbox>
<Button Content="Do It" Click="Button_Click" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,20" />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
代码背后:
public …Run Code Online (Sandbox Code Playgroud) 所以我有一些像这样的代码:
DataSet dataSet = new DataSet();
DataTable dataTable1 = new DataTable("Table1");
DataTable dataTable2 = new DataTable("Table2");
DataTable dataTable3 = new DataTable("Table3");
DataTable dataTable4 = new DataTable("Table4");
dataSet.Tables.Add(dataTable1);
dataSet.Tables.Add(dataTable2);
dataSet.Tables.Add(dataTable3);
dataSet.Tables.Add(dataTable4);
SqlDataAdapter dataAdapter1 = new SqlDataAdapter("SELECT * FROM Table1 WHERE ID = 1", sqlConnection);
SqlDataAdapter dataAdapter2 = new SqlDataAdapter("SELECT Column1, Column2, Column3 FROM Table2", sqlConnection);
SqlDataAdapter dataAdapter3 = new SqlDataAdapter("SELECT Column1, Column2, Column3 FROM Table3", sqlConnection);
SqlDataAdapter dataAdapter4 = new SqlDataAdapter("SELECT Column1, Column2, Column3 FROM Table4", sqlConnection);
SqlCommandBuilder commandBuilder1 = new …Run Code Online (Sandbox Code Playgroud)