** БЫСТРО РЕАГИРУЮЩЕЕ РЕШЕНИЕ **
Принятие элемента в отделении, другое отделение
, это решение хорошо работает
<div class="container">
<div class="center"></div>
</div>
, контейнер может быть любым размером (должен быть родственник положения)
.container {
position: relative;/*important*/
width: 200px;/*any width*/
height: 200px;/*any height*/
background: red;
}
, элемент ( отделение ) может также быть любым размером (должен быть меньше, чем контейнер )
.center {
position: absolute;/*important*/
top: 50%;/*position Y halfway in*/
left: 50%;/*position X halfway in*/
transform: translate(-50%,-50%);/*move it halfway back(x,y)*/
width: 100px;/*any width*/
height: 100px;/*any height*/
background: blue;
}
, результат будет похож на это. Выполните фрагмент кода
.container {
position: relative;
width: 200px;
height: 200px;
background: red;
}
.center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
width: 100px;
height: 100px;
background: blue;
}
<div class="container">
<div class="center"></div>
</div>
, я нашел это очень полезным
Как вы сказали, Action не принимает никаких параметров . Если вы сделаете это:
var stringAction = new System.Action(StringAction("a string"));
Фактически вы выполните метод здесь, так что это не параметр метода.
если вы сделаете это:
var stringAction = new System.Action(param => StringAction("a string"));
вы сообщите ему, что ваш метод принимает параметр с именем param
, чего нет в Action.
Правильный способ сделать это:
var stringAction = new System.Action( () => StringAction("a string"));
или более компактный:
Action stringAction = () => StringAction("a string");
пустые скобки используются для обозначения, что лямбда не принимает никаких параметров.
Я не эксперт в этом, но вы пробовали это?
public void TestDelegateStatement4
{
var stringAction = () => StringAction("a string");
}
Делегат действия
определяется как делегат метода, который не имеет параметров и возвращает void. В примере 1 вы делаете 2 ошибки:
1. Вы пытаетесь предоставить метод, который принимает параметр
2. Вы вызываете метод, а не указываете его в качестве параметра (это должно быть новое действие (имя метода)), хотя он не будет работать из-за 1.
В примере 2 вы делаете ту же ошибку опять же, ваша лямбда принимает параметр, вы должны написать его так:
new Action (() => StringAction ("a string"));
Если вы хотите создать делегат, он будет параметр, вы должны сделать это так:
new Action
Итак, в вашем случае полный код будет выглядеть следующим образом:
private void StringAction(string aString) // method to be called
{
return;
}
private void TestDelegateStatement1() // now it works
{
var stringAction = new Action<string>(StringAction);
//You can call it now:
stringAction("my string");
}
private void TestDelegateStatement2() // now it works
{
var stringAction = () => StringAction("a string");
//Or the same, with a param:
var stringActionParam = (param) => StringAction(param);
//You can now call both:
stringAction();
stringActionParam("my string");
}
private void TestDelegateStatement3() // this is ok
{
var stringAction = new System.Action(StringActionCaller);
stringAction();
}
private void StringActionCaller()
{
StringAction("a string");
}
В C # 2.0 делегат Action
является делегатом void
, который не принимает параметры.
В более поздних версиях есть общий делегат Action
, где T указывает тип параметра.
Это должно работать:
var stringAction = new Action<string>(param => StringAction(param));
или даже лучше:
var stringAction = new Action<string>(StringAction); // using method group conversion
, тогда вы можете вызвать
stringAction("Hello world");
]